译者按: 还没学好ES6?ECMAScript 2018已到来啦!
- 原文:ECMAScript regular expressions are getting better!
- 作者: Mathias Bynens: Google V8引擎开发者
- 译者:Fundebug
为了保证可读性,本文采纳意译而非直译。别的,本文版权归原作者一切,翻译仅用于进修。
1999年,ECMAScript 3增加了对正则表达式的支撑。
16年以后,ECMAScript 6(即ECMAScript 2015或许ES6)引入了Unicode形式(u选项), sticky形式(y选项)以及RegExp.prototype.flags的getter要领。
这篇博客将引见ECMAScript正则表达式的最新特征:
- dotAll形式(s选项)
- Lookbehind断言
- Named capture groups
- Unicode property escapes
- String.prototype.matchAll
- 范例RegExp遗留特征
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.$1到RegExp.$9。虽然这些特征已弃用(deprecated)了,然则为了兼容性我们不能将他们去。因而,范例这些RegExp遗留特征是最好的要领。因而,这个提案有助于保证兼容性。
参考
关于Fundebug
Fundebug专注于JavaScript、微信小递次、微信小游戏、支付宝小递次、React Native、Node.js和Java及时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了6亿+毛病事宜,得到了Google、360、金山软件等浩瀚着名用户的承认。迎接免费试用!
版权声明
转载时请说明作者Fundebug以及本文地点:
https://blog.fundebug.com/2018/08/30/ecmascript-regular-expression-new-features/