ES6精華 正則擴充套件

2021-09-13 15:09:37 字數 4922 閱讀 4185

本篇概括了es6中正規表示式新增部分的精華要點(最好有es5的基礎)。

使正則處於unicode模式。

關於es6的字元擴充套件知識,可檢視這裡。

處於unicode模式下的正則,可以正確識別32位(四位元組)字元。

let c = '\ud83d\udc2a'; // 32位字元:?。

console.log( /^\s$/.test(c) ); // false,視為兩字元。

console.log( /^\s$/u.test(c) ); // true,正確識別,視為一字元。

console.log( /\ud83d/.test(c) ); // true

console.log( /\ud83d/u.test(c) ); // false

console.log( /?/.test('??') ); // false,其等價於下者。

console.log( /\ud83d\udc2a/.test('\ud83d\udc2a\udc2a') ); // true

console.log( /?/u.test('??') ); // true

處於unicode模式下的正則,支援帶{}unicode表示法。

console.log( /\u/.test('?') ); // false

console.log( /\u/u.test('?') ); // true

處於unicode模式下的正則,可以用來獲取字串的正確長度。

console.log( stringlength('??') ); // 2

function stringlength(str)

處於unicode模式下的正則,可以識別一些非規範字元。

let k1 = '\u004b'; // 規範的 k 。

let k2 = '\u212a'; // 非規範的 k 。

console.log( /[a-z]/i.test(k2) ); // false

console.log( /[a-z]/ui.test(k2) ); // true

unicode字元都有某些屬性(類別),比如3、ⅲ 都屬於number

結合u標誌,\p可以用來匹配屬於某一類某一種值的字元。

對於一般的屬性,可以直接使用\p\p(另外,大寫p表否定)。

let reg = /\p/u; // 匹配屬於 number 屬性的字元。

console.log( reg.test('3') ); // true

console.log( reg.test('㉛') ); // true

console.log( reg.test('ⅲ') ); // true

使正則處於sticky(粘連)模式。

它確保了每次查詢的開始,都是緊接上次查詢的末尾,不會跳過中間不匹配的字元。

其本質是在每次查詢中加了^匹配開頭的模式,使整個字元進行嚴格的乙個接乙個的檢查。

console.log( 'a1a'.match(/a/g).length ); // 2

console.log( 'a1a'.match(/a/gy).length ); // 1

console.log( '1a1a'.match(/a/g).length ); // 2

console.log( '1a1a'.match(/a/gy) ); // null

模擬 sticky 模式大概是這樣。

let str = 'a1a';

let res = /^a/.exec(str);

while (res)

對於正則物件,y會像g標誌一樣設定其lastindex(類似全域性性)。

let reg = null;

reg = /a/y;

reg.exec('aaa');

console.log( reg.lastindex ); // 1

reg.exec('aaa');

console.log( reg.lastindex ); // 2

reg = /a/y;

'aaa'.match(reg);

console.log( reg.lastindex ); // 1

'aaa'.match(reg);

console.log( reg.lastindex ); // 2

reg = /a/y;

'aaa'.replace(reg);

console.log( reg.lastindex ); // 1

'aaa'.replace(reg);

console.log( reg.lastindex ); // 2

使正則處於dotall模式,即.代表全部字元(之前不包括行終止符\r,\n等)。

也有其它可以表示全部字元的方式,比如:[^],[\s\s]

console.log( /./.test('\n') ); // false

console.log( /./s.test('\n') ); // true

表示全部字元與表示行的首尾並不衝突,但在mg雙重模式下要明確是否使用非貪婪模式。

let str = `hello!`;

console.log( str.match(/^.*$/g) ); // ["hello!"]

console.log( str.match(/^.*$/gs) ); // ["hello!"]

let str1 = `

a.b.

`;console.log( str1.match(/^.*$/mg) ); // ["", " a.", " b.", ""]

console.log( str1.match(/^.*$/msg) ); // ["↵ a.↵ b.↵", ""]

console.log( str1.match(/^.*?$/msg) ); // . 的匹配非貪婪模式,["", " a.", " b.", ""]。

補充:貪婪與非貪婪性。

對於量詞,比如+,,其前者的匹配會盡可能達到此區間的最大值,為貪婪性。

如果在量詞後面加上?,意味著其前者的匹配為此區間的最小值,可為0,為非貪婪性。

console.log( '1234'.match(/(\d*)(\d*)/) ); // ["1234", "1234", ""]

console.log( '1234'.match(/(\d*?)(\d*)/) ); // ["1234", "", "1234"]

結合已有的先行斷言一起看。

先行肯定/否定斷言:x(?=y) / x(?!y)

後行肯定/否定斷言:(?<=y)x / (?後行斷言的條件語句(()裡的)的查詢順序是從右向左(逆序)匹配。

但是其中的子模式的預設命名序號,依舊是從左到右算的(可參考下面內容)。

兩個子組都是貪婪的,`(\d+a)`獲得的數字多,說明其先被匹配的。

let str = '123a%';

let reg = /(?<=(\d+)(\d+a))%/;

str.match(reg); // ["%", "1", "23a"],23a 為第二個匹配組 (\d+a) 的結果。

之前的組(子模式)都沒有具體名字,它們是從左到右從1開始被命名。

現在允許為每乙個組匹配指定乙個名字,既便於閱讀**,又便於引用。

一旦使用了具名組,匹配的結果中groups屬性便指向乙個包含相應結果的物件。

let str = '1234';

let reg = /(?\d+)(?\d+)/;

console.log( reg.exec(str).groups ); //

console.log( str.match(reg).groups ); //

正則中引用匹配結果的三種方式。

第一種是上面示例所示的,搭配具名組在結果中引用。

第二種是在replace時用到的,使用$n$在替換字元中替代匹配。

第三種是直接在正則中替代之前組的匹配,使用\n\

--- 第二種

let str = 'a,b-c';

let reg = /([,-])/g;

console.log( str.replace(reg, ' $1 ') ); // a , b - c

--- 第三種

let reg = /(?\d)\d+\k/;

console.log( reg.test('111211') ); // false

console.log( reg.test('1112111') ); // true

ES6精華 數值擴充套件

es6為數值增加了些常量和方法,使計算更為簡便安全。本篇概括了這中的精華知識。js採用ieee 754標準的64位雙精度格式儲存數值。數值的精度最多可達到53個二進位制位 1個隱藏位和52個有效位 如果數值的精度超過此限度,第54位及後面的會被丟棄。數值的極值分為兩種 可表示的極值和可精確計算的極值...

es6 語法 (正則擴充套件)

es5中常見修飾符是g i es6中新增 y,u exec 方法用於檢索字串中的正規表示式的匹配。test a false console.log u u.test a true 加上u才能被識別 console.log u let s console.log u test s false cons...

ES6 正則的擴充套件

一,regexp 建構函式 es5中,regexp建構函式的引數有兩種情況。1,引數是字串,第二個引數表示正規表示式的修飾符 flag 2,引數是乙個正規表示式,返回乙個原有正規表示式的拷貝。es6中,如果regexp建構函式第乙個引數是乙個正則物件,那麼可以使用第二個引數指定修飾符。而且,返回的正...