譯者按: 還沒學(xué)好ES6捡鱼?ECMAScript 2018已經(jīng)到來啦!
- 原文:ECMAScript regular expressions are getting better!
- 作者: Mathias Bynens: Google V8引擎開發(fā)者
- 譯者:Fundebug
為了保證可讀性毫深,本文采用意譯而非直譯吩坝。另外,本文版權(quán)歸原作者所有哑蔫,翻譯僅用于學(xué)習(xí)钉寝。
1999年,ECMAScript 3添加了對(duì)正則表達(dá)式的支持闸迷。
16年之后嵌纲,ECMAScript 6(即ECMAScript 2015或者ES6)引入了Unicode模式(u選項(xiàng)), sticky模式(y選項(xiàng))以及RegExp.prototype.flags的getter方法。
這篇博客將介紹ECMAScript正則表達(dá)式的最新特性:
- dotAll模式(s選項(xiàng))
- Lookbehind斷言
- Named capture groups
- Unicode property escapes
- String.prototype.matchAll
- 規(guī)范RegExp遺留特性
1. dotAll模式(s選項(xiàng))
這個(gè)特性已經(jīng)在ECMAScript 2018正式發(fā)布了腥沽。
默認(rèn)情況下逮走,.
可以匹配任意字符,除了換行符:
/foo.bar/u.test('foo\nbar'); // false
另外今阳,.
不能匹配Unicode字符师溅,需要使用u
選項(xiàng)啟用Unicode模式才行。
ES2018引入了dotAll模式酣栈,通過s
選項(xiàng)可以啟用险胰,這樣,.
就可以匹配換行符了矿筝。
/foo.bar/su.test('foo\nbar'); // true
2. Lookbehind斷言
這個(gè)特性已經(jīng)在ECMAScript 2018正式發(fā)布了起便。
ECMAScript目前僅支持lookahead斷言。
下面示例是Positive lookahead窖维,匹配字符串“42 dollars”中緊跟著是"dollars"的數(shù)字:
const pattern = /\d+(?= dollars)/u;
const result = pattern.exec('42 dollars');
console.log(result[0]); // 打印42
下面示例是Negative lookahead榆综,匹配字符串“42 pesos”中緊跟著的不是"dollars"的數(shù)字:
const pattern = /\d+(?! dollars)/u;
const result = pattern.exec('42 pesos');
console.log(result[0]); // 打印42
ES2018添加了lookbehind斷言。
下面示例是Positive lookbehind铸史,匹配字符串“"的數(shù)字:
const pattern = /(?<=\$)\d+/u;
const result = pattern.exec('$42');
console.log(result[0]); // 打印42
下面示例是Negative lookbehind鼻疮,匹配字符串“"的數(shù)字:
const pattern = /(?<!\$)\d+/u;
const result = pattern.exec('€42');
console.log(result[0]); // 打印42
Fundebug專注于網(wǎng)頁(yè)、微信小程序琳轿、微信小游戲判沟,支付寶小程序,React Native崭篡,Node.js和Java線上BUG實(shí)時(shí)監(jiān)控挪哄,歡迎免費(fèi)試用
3. Named capture groups
這個(gè)特性已經(jīng)在ECMAScript 2018正式發(fā)布了。
目前琉闪,正則表達(dá)式中小括號(hào)匹配的分組是通過數(shù)字編號(hào)的:
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"
這樣很方便迹炼,但是可讀性很差,且不易維護(hù)。一旦正則表達(dá)式中小括號(hào)的順序有變化時(shí)斯入,我們就需要更新對(duì)應(yīng)的數(shù)字編號(hào)砂碉。
ES2018添加named capture groups, 可以指定小括號(hào)中匹配內(nèi)容的名稱,這樣可以提高代碼的可讀性刻两,也便于維護(hù)增蹭。
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
這個(gè)特性已經(jīng)在ECMAScript 2018正式發(fā)布了。
Unicode標(biāo)準(zhǔn)為每一個(gè)字符分配了多個(gè)屬性闹伪。比如沪铭,當(dāng)你要匹配希臘語(yǔ)字符時(shí),則可以搜索Script_Extensions屬性為Greek的字符偏瓤。
Unicode property escapes使得我們可以使用ECMAScript正則表達(dá)式直接匹配Unicode字符的屬性:
const regexGreekSymbol = /\p{Script_Extensions=Greek}/u;
console.log(regexGreekSymbol.test('π')); // 打印true
5. String.prototype.matchAll
這個(gè)特性還處在Stage 3 Draft
g和y選項(xiàng)通常用于匹配一個(gè)字符串杀怠,然后遍歷所有匹配的子串,包括小括號(hào)匹配的分組厅克。String.prototype.matchAll讓這個(gè)操作變得更加簡(jiǎn)單了赔退。
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);
}
每一個(gè)迭代所返回的match對(duì)象與regex.exec(string)所返回的結(jié)果相同:
// 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'
]
注意,這個(gè)特性還處在Stage 3 Draft证舟,因此還存在變化的可能性硕旗,示例代碼是根據(jù)最新的提案寫的。另外女责,瀏覽器也還沒有支持這個(gè)特性漆枚。String.prototype.matchAll最快可以被加入到ECMAScript 2019中。
6. 規(guī)范RegExp遺留特性
這個(gè)提案還處在Stage 3 Draft
這個(gè)提案規(guī)范了RegExp的遺留特性抵知,比如RegExp.prototype.compile方法以及它的靜態(tài)屬性從RegExp.$1到RegExp.$9墙基。雖然這些特性已經(jīng)棄用(deprecated)了,但是為了兼容性我們不能將他們?nèi)ニ⑾病R虼瞬兄疲?guī)范這些RegExp遺留特性是最好的方法。因此掖疮,這個(gè)提案有助于保證兼容性初茶。
參考
- 阮一峰 - ECMAScript 6 入門
- Fundebug博客 - JavaScript正則表達(dá)式進(jìn)階指南
- ECMAScript 2018: the final feature set
關(guān)于Fundebug
Fundebug專注于JavaScript、微信小程序浊闪、微信小游戲恼布、支付寶小程序、React Native搁宾、Node.js和Java實(shí)時(shí)BUG監(jiān)控折汞。 自從2016年雙十一正式上線,F(xiàn)undebug累計(jì)處理了6億+錯(cuò)誤事件猛铅,得到了Google、360凤藏、金山軟件等眾多知名用戶的認(rèn)可奸忽。歡迎免費(fèi)試用堕伪!
版權(quán)聲明:
轉(zhuǎn)載時(shí)請(qǐng)注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2018/08/30/ecmascript-regular-expression-new-features/