ECMAScript正则表达式6个最新特征

译者按: 还没学好ES6?ECMAScript 2018已到来啦!

为了保证可读性,本文采纳意译而非直译。别的,本文版权归原作者一切,翻译仅用于进修。

1999年,ECMAScript 3增加了对正则表达式的支撑。

16年以后,ECMAScript 6(即ECMAScript 2015或许ES6)引入了Unicode形式(u选项), sticky形式(y选项)以及RegExp.prototype.flags的getter要领

这篇博客将引见ECMAScript正则表达式的最新特征

1. dotAll形式(s选项)

这个特征已在ECMAScript 2018正式宣布了。

默许情况下,.能够婚配恣意字符,除了换行符:

/foo.bar/u.test('foo\nbar'); // false

别的,.不能婚配Unicode字符,须要运用u选项启用Unicode形式才行。

ES2018引入了dotAll形式,经由过程s选项能够启用,如许,.就能够婚配换行符了。

/foo.bar/su.test('foo\nbar'); // true

2. Lookbehind断言

这个特征已在ECMAScript 2018正式宣布了。

ECMAScript现在仅支撑lookahead断言。

下面示例是Positive lookahead,婚配字符串“42 dollars”中紧跟着是”dollars”的数字:

const pattern = /\d+(?= dollars)/u;
const result = pattern.exec('42 dollars');
console.log(result[0]); // 打印42

下面示例是Negative lookahead,婚配字符串“42 pesos”中紧跟着的不是”dollars”的数字:

const pattern = /\d+(?! dollars)/u;
const result = pattern.exec('42 pesos');
console.log(result[0]); // 打印42

ES2018增加了lookbehind断言

下面示例是Positive lookbehind,婚配字符串“$42”中前面是”\$”的数字:

const pattern = /(?<=\$)\d+/u;
const result = pattern.exec('$42');
console.log(result[0]); // 打印42

下面示例是Negative lookbehind,婚配字符串“$42”中前面不是是”\$”的数字:

const pattern = /(?<!\$)\d+/u;
const result = pattern.exec('€42');
console.log(result[0]); // 打印42

Fundebug专注于网页、微信小递次、微信小游戏,支付宝小递次,React Native,Node.js和Java线上BUG及时监控,迎接免费试用

3. Named capture groups

这个特征已在ECMAScript 2018正式宣布了。

现在,正则表达式中小括号婚配的分组是经由过程数字编号的:

const pattern = /(\d{4})-(\d{2})-(\d{2})/u;
const result = pattern.exec('2017-01-25');
console.log(result[0]); // 打印"2017-01-25"
console.log(result[1]); // 打印"2017"
console.log(result[2]); // 打印"01"
console.log(result[3]); // 打印"25"

如许很轻易,然则可读性很差,且不容易保护。一旦正则表达式中小括号的递次有变化时,我们就须要更新对应的数字编号。

ES2018增加named capture groups, 能够指定小括号中婚配内容的称号,如许能够进步代码的可读性,也便于保护。

const pattern = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/u;
const result = pattern.exec('2017-01-25');
console.log(result.groups.year); // 打印"2017"
console.log(result.groups.month); // 打印"01"
console.log(result.groups.day); // 打印"25"

4. Unicode property escapes

这个特征已在ECMAScript 2018正式宣布了。

Unicode规范为每个字符分配了多个属性。比方,当你要婚配希腊语字符时,则能够搜刮Script_Extensions属性为Greek的字符。

Unicode property escapes使得我们能够运用ECMAScript正则表达式直接婚配Unicode字符的属性:

const regexGreekSymbol = /\p{Script_Extensions=Greek}/u;
console.log(regexGreekSymbol.test('π')); // 打印true

5. String.prototype.matchAll

这个特征还处在Stage 3 Draft

g和y选项一般用于婚配一个字符串,然后遍历一切婚配的子串,包含小括号婚配的分组。String.prototype.matchAll让这个操纵变得越发简朴了。

const string = 'Magic hex numbers: DEADBEEF CAFE 8BADF00D';
const regex = /\b[0-9a-fA-F]+\b/g;
for (const match of string.matchAll(regex)) {
    console.log(match);
}

每个迭代所返回的match对象与regex.exec(string)所返回的效果雷同:

// Iteration 1:
[
    'DEADBEEF',
    index: 19,
    input: 'Magic hex numbers: DEADBEEF CAFE 8BADF00D'
]

// Iteration 2:
[
    'CAFE',
    index: 28,
    input: 'Magic hex numbers: DEADBEEF CAFE 8BADF00D'
]

// Iteration 3:
[
    '8BADF00D',
    index: 33,
    input: 'Magic hex numbers: DEADBEEF CAFE 8BADF00D'
]

注重,这个特征还处在Stage 3 Draft,因而还存在变化的可能性,示例代码是依据最新的提案写的。别的,浏览器也还没有支撑这个特征。String.prototype.matchAll最快能够被加入到ECMAScript 2019中。

6. 范例RegExp遗留特征

这个提案还处在Stage 3 Draft

这个提案范例了RegExp的遗留特征,比方RegExp.prototype.compile要领以及它的静态属性从RegExp.&dollar;1RegExp.&dollar;9。虽然这些特征已弃用(deprecated)了,然则为了兼容性我们不能将他们去。因而,范例这些RegExp遗留特征是最好的要领。因而,这个提案有助于保证兼容性。

参考

关于Fundebug

Fundebug专注于JavaScript、微信小递次、微信小游戏、支付宝小递次、React Native、Node.js和Java及时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了6亿+毛病事宜,得到了Google、360、金山软件等浩瀚着名用户的承认。迎接免费试用!

《ECMAScript正则表达式6个最新特征》

版权声明

转载时请说明作者Fundebug以及本文地点:
https://blog.fundebug.com/2018/08/30/ecmascript-regular-expression-new-features/

    原文作者:Fundebug
    原文地址: https://segmentfault.com/a/1190000016202186
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞