譯者按:還沒學好es6?ecmascript 2018已經到來啦!
2023年,ecmascript 3新增了對正規表示式的支援。
16年之後,ecmascript 6(即ecmascript 2015或者es6)引入了unicode模式(u選項), sticky模式(y選項)以及regexp.prototype.flags的getter方法。
這篇部落格將介紹ecmascript正規表示式的最新特性:
這個特性已經在ecmascript 2018正式發布了。預設情況下,
.
可以匹配任意字元,除了換行符:
/foo.bar/u.test('foo\nbar'); // false
另外,.
不能匹配unicode字元,需要使用u
選項啟用unicode模式才行。
es2018引入了dotall模式,通過s
選項可以啟用,這樣,.
就可以匹配換行符了。
/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 = /(?這個特性已經在ecmascript 2018正式發布了。
目前,正規表示式中小括號匹配的分組是通過數字編號的:
const pattern = /(\d)-(\d)-(\d)/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 = /(?\d)-(?\d)-(?\d)/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/u;
console.log(regexgreeksymbol.test('π')); // 列印true
這個特性還處在stage 3 draftg和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))
每乙個迭代所返回的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遺留特性是最好的方法。因此,這個提案有助於保證相容性。
螢幕快照 2018-08-30 上午8.28.52.png
正規表示式 正規表示式 總結
非負整數 d 正整數 0 9 1 9 0 9 非正整數 d 0 負整數 0 9 1 9 0 9 整數 d 非負浮點數 d d 正浮點數 0 9 0 9 1 9 0 9 0 9 1 9 0 9 0 9 0 9 1 9 0 9 非正浮點數 d d 0 0 負浮點數 正浮點數正則式 英文本串 a za z...
正規表示式 表示式
網域名稱 a za z0 9 a za z0 9 a za z0 9 a za z0 9 interneturl a za z s 或 http w w w 手機號碼 13 0 9 14 5 7 15 0 1 2 3 5 6 7 8 9 18 0 1 2 3 5 6 7 8 9 d 號碼 x x x...
Linux正規表示式 編寫正規表示式
為了所有實用化的用途,你可以通過使用程式產生正確的結果。然而,並不意味著程式總是如你所願的那樣正確地工作。多數情況下,如果程式不能產生想要的輸出,可以斷定真正的問題 排除輸入或語法錯誤 在於如何描述想要的東西。換句話說,應該考慮糾正問題的地方是描述想要的結果的表示式。表示式不完整或者公式表示得不正確...