Skip to content

6个你今天可以使用的JavaScript正则表达式功能

正则表达式虽然非常强大,但是很难掌握。下面是6个有用的功能,可以帮助你开始在JavaScript项目中使用它们:

捕获组

捕获组允许你通过将正则表达式的一部分放在括号(...)中来获取匹配字符串的特定部分:

const str = 'JavaScript是一种编程语言';
/(JavaScript)是一种(.*)/.exec(str);
/*
  [
    0: 'JavaScript是一种编程语言',
    1: 'JavaScript',
    2: '编程语言'
  ]
*/

非捕获组

非捕获组用于匹配但不捕获的内容,比如你不真正需要的一个或另一个匹配组。它们的定义方式与捕获组类似,但是前缀为?:

const str = 'JavaScript是一种编程语言';
/(?:JavaScript|Python)是一种(.+)/.exec(str);
/*
  [
    0: 'JavaScript是一种编程语言',
    1: '编程语言'
  ]
*/

命名捕获组

命名捕获组允许你给捕获组命名,只需在前缀加上<name>

const str = 'JavaScript是一种编程语言';
/(?<subject>.+)是一种(?<description>.+)/.exec(str);
/*
  [
    0: 'JavaScript是一种编程语言',
    1: 'JavaScript',
    2: '编程语言',
    groups: {
      subject: 'JavaScript,
      description: '编程语言'
    }
  ]
*/

捕获组反向引用

通过使用\1\2等重复现有的捕获组,可以帮助您编写更短的正则表达式。同样,您也可以使用\k<name>重复命名的捕获组:

const str = 'JavaScript是一种编程语言 - 一种很棒的编程语言JavaScript';
/(.+)是一种(?<description>.+) - 一种很棒的\k<description> \1/.exec(str);
/*
  [
    0: 'JavaScript是一种编程语言 - 一种很棒的编程语言JavaScript',
    1: 'JavaScript',
    2: '编程语言',
    groups: {
      subject: 'JavaScript,
      description: '编程语言'
    }
  ]
*/

向前查看

向前查看允许您检查某个内容是否后跟某个模式,而不实际匹配它。您可以使用?=创建正向查看,使用?!创建负向查看:

const str = 'JavaScript不同于Java,您应该记住这一点';
/Java(?=Script)(.*)/.exec(str);
/*
  [
    0: 'JavaScript不同于Java,您应该记住这一点',
    1: 'Script不同于Java,您应该记住这一点'
  ]
*/

/Java(?!Script)(.*)/.exec(str);
/*
  [
    0: 'Java,您应该记住这一点',
    1: ',您应该记住这一点'
  ]
*/

Unicode字符

最后,您可以使用/p{...}/u标志来匹配Unicode字符。示例包括但不限于{Emoji}{Math_Symbols}{Script=Greek}

const str = 'Greek looks like this: γεια';
/\p{Script=Greek}+/u.exec(str);
/*
  [
    0: 'γεια'
  ]
*/