Google V8团队提出并设计了几个新特性来使得JavaScript的正则表达式更为强大。这些特性当前(2017-7-28)处于Stage3的阶段。访问chrome://flags/#enable-javascript-harmony开启这些特性体验。
命名捕获
正则表达式有所谓的分组捕获,可以将捕获的内容分组,目前而言,开发者只能根据捕获组的序号获得这些捕获分组,这样带来的两个问题是,当分组嵌套或者分组数发生改变时,代码会变得难以处理。比如:
/(?:(.)(.(?<=[^(])(.)))/ //最后一个分组的序号是?
/(a)(b)(c)\3\2\1/ // 捕获abccba
/(.)(a)(b)(c)\4\3\2/ //当添加一个需求时,所有序号都需要改变
命令捕获,与Java等语言一样,可以让开发者对分组进行命名并引用。测试如下:
通过在分组中插入<groupname>标签,可以对捕获分组进行命名。可以用字符串的replace方法测试一下:
const pattern = /(?<fst>a)(?<snd>b)/;
'ab'.replace(pattern,'$<snd>$<fst>'); //'ba'
'ab',replace(pattern,(match,...groups, o, s,{fst, snd}) => fst + snd);
反向断言
与Perl等语言一致,JavaScript的反向断言语法如下:
/(?<=\$)\d+/.exec('$1 is worth about ¥123'); // ['1']
/(?<!\$)\d+/.exec('$1 is worth about ¥123'); // ['123']