本篇概括了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)`獲得的數字多,說明其先被匹配的。之前的組(子模式)都沒有具體名字,它們是從左到右從1開始被命名。let str = '123a%';
let reg = /(?<=(\d+)(\d+a))%/;
str.match(reg); // ["%", "1", "23a"],23a 為第二個匹配組 (\d+a) 的結果。
現在允許為每乙個組匹配指定乙個名字,既便於閱讀**,又便於引用。
一旦使用了具名組,匹配的結果中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建構函式第乙個引數是乙個正則物件,那麼可以使用第二個引數指定修飾符。而且,返回的正...