爲了保證可讀性,本文采用意譯而非直譯。另外,本文版權歸原做者全部,翻譯僅用於學習。git
1999年,ECMAScript 3添加了對正則表達式的支持。es6
16年以後,ECMAScript 6(即ECMAScript 2015或者ES6)引入了Unicode模式(u選項), sticky模式(y選項)以及RegExp.prototype.flags的getter方法。github
這篇博客將介紹ECMAScript正則表達式的最新特性:web
這個特性已經在ECMAScript 2018正式發佈了。正則表達式
默認狀況下,.
能夠匹配任意字符,除了換行符:express
/foo.bar/u.test('foo\nbar'); // false
另外,.
不能匹配Unicode字符,須要使用u
選項啓用Unicode模式才行。小程序
ES2018引入了dotAll模式,經過s
選項能夠啓用,這樣,.
就能夠匹配換行符了。segmentfault
/foo.bar/su.test('foo\nbar'); // true
這個特性已經在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,匹配字符串「 」的數字:
const pattern = /(?<=\$)\d+/u; const result = pattern.exec('$42'); console.log(result[0]); // 打印42
下面示例是Negative lookbehind,匹配字符串「 」的數字:
const pattern = /(?<!\$)\d+/u; const result = pattern.exec('€42'); console.log(result[0]); // 打印42
Fundebug專一於網頁、微信小程序、微信小遊戲,支付寶小程序,React Native,Node.js和Java線上BUG實時監控,歡迎免費試用
這個特性已經在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"
這個特性已經在ECMAScript 2018正式發佈了。
Unicode標準爲每個字符分配了多個屬性。好比,當你要匹配希臘語字符時,則能夠搜索Script_Extensions屬性爲Greek的字符。
Unicode property escapes使得咱們可使用ECMAScript正則表達式直接匹配Unicode字符的屬性:
const regexGreekSymbol = /\p{Script_Extensions=Greek}/u; console.log(regexGreekSymbol.test('π')); // 打印true
這個特性還處在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中。
這個提案還處在Stage 3 Draft
這個提案規範了RegExp的遺留特性,好比RegExp.prototype.compile方法以及它的靜態屬性從RegExp.$1到RegExp.$9。雖然這些特性已經棄用(deprecated)了,可是爲了兼容性咱們不能將他們去。所以,規範這些RegExp遺留特性是最好的方法。所以,這個提案有助於保證兼容性。
翻譯原文