ECMAScript正規表示式6個最新特性

2021-09-20 01:31:23 字數 3904 閱讀 6218

譯者按:還沒學好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 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))

每乙個迭代所返回的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.$1regexp.$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正規表示式 編寫正規表示式

為了所有實用化的用途,你可以通過使用程式產生正確的結果。然而,並不意味著程式總是如你所願的那樣正確地工作。多數情況下,如果程式不能產生想要的輸出,可以斷定真正的問題 排除輸入或語法錯誤 在於如何描述想要的東西。換句話說,應該考慮糾正問題的地方是描述想要的結果的表示式。表示式不完整或者公式表示得不正確...