ES 6エッセンス:正則拡張
5966 ワード
本編では、
1 uマーク
正則を
1.1 4バイト文字
1.2非正規文字
1.3属性クラス
2 yフラグ
正則を
正規オブジェクトの場合、
3 sフラグ
正則を
すべての文字が表示行の先頭と衝突しないことを示すが、
補足:貪欲と非貪欲性.量詞、例えば
4後行アサーション
既存の先行断言と結びつけて見る.先行肯定/否定断言:
ES6
における正規表現の新規部分のエッセンスポイント(ES5
の基礎があることが望ましい)を要約した.1 uマーク
正則を
Unicode
モードにします.ES6
の文字拡張については、ここを参照してください.1.1 4バイト文字
Unicode
モードの正則では、32ビット(4バイト)文字を正しく認識できます.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( /?{2}/.test('??') ); // false, 。
console.log( /\uD83D\uDC2A{2}/.test('\uD83D\uDC2A\uDC2A') ); // true
console.log( /?{2}/u.test('??') ); // true
Unicode
モードにある正則は、サポートバンド{}
のUnicode
表現である.console.log( /\u{20BB7}/.test('?') ); // false
console.log( /\u{20BB7}/u.test('?') ); // true
Unicode
モードの正則は、文字列の正確な長さを取得するために使用することができる.console.log( stringLength('??') ); // 2
function stringLength(str) {
let res = str.match(/[\s\S]/gu);
return res ? res.length : 0;
}
1.2非正規文字
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
1.3属性クラス
Unicode
文字には、3、IIIがNumber
に属するなど、いくつかの属性(カテゴリ)があります.u
フラグと組み合わせて、\p{ = }
を使用して、ある種類の値に属する文字を一致させることができます.一般的な属性については、\p{ }
または\p{ }
を直接使用することができます(また、大文字P
表は否定します).let reg = /\p{Number}/u; // Number 。
console.log( reg.test('3') ); // true
console.log( reg.test('㉛') ); // true
console.log( reg.test('Ⅲ') ); // true
2 yフラグ
正則を
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) {
str = str.slice(res.index + res[0].length)
res = /^a/.exec(str);
}
正規オブジェクトの場合、
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
3 sフラグ
正則を
dotAll
モード、すなわち.
は全文字を表す(これまで行終端子\r
、
等は含まれていなかった).他にも全文字を表す方法がある.例えば、[^]
、[\s\S]
である.console.log( /./.test('
') ); // false
console.log( /./s.test('
') ); // 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.", ""]。
補足:貪欲と非貪欲性.量詞、例えば
+, {1, 3}
については、前者のマッチングができるだけこの区間の最大値に達し、貪欲性である.量詞の後に?
を加えると、その前者のマッチングがこの区間の最小値であることを意味し、0であり、非貪欲であることができる.console.log( '1234'.match(/(\d*)(\d*)/) ); // ["1234", "1234", ""]
console.log( '1234'.match(/(\d*?)(\d*)/) ); // ["1234", "", "1234"]
4後行アサーション
既存の先行断言と結びつけて見る.先行肯定/否定断言:
x(?=y) / x(?!y)
.後行肯定/否定断言:(?<=y)x / (?。
x
、その / を たすかどうかを ます. した はx
にすぎず、 は まれない.---
let str = 'The price is $12.';
let reg = /\$(?=(\d+))/;
console.log( str.match(reg) ); // ["$", "12"],$ ,122 。
---
let str = 'The percentage is 57%';
let reg = /(?<=(\d+))%/;
console.log( str.match(reg) ); // ["%", "57"]
の ()の は、 から ( )に します.ただし、サブモードのデフォルトのネーミングシーケンス は、 から に されます( を ). ,`(\d+a)` , 。
let str = '123a%';
let reg = /(?<=(\d+)(\d+a))%/;
str.match(reg); // ["%", "1", "23a"],23a (\d+a) 。
5 グループ
のグループ(サブモード)には、 から へ1から が けられていた な はありませんでした. グループの に を できます.コードの み りや が になります. きグループを すると、 した のgroups
は、 する を むオブジェクトを します.let str = '1234';
let reg = /(?\d+)(?\d+)/;
console.log( reg.exec(str).groups ); // {one: "123", two: "4"}
console.log( str.match(reg).groups ); // {one: "123", two: "4"}
で する を する3つの .1つ は、 の で したように、 み わせ グループが に されます.2つ は、replace
で され、$n
または$
を して、 を に き える.3つ は、
または\
を して、 のグループのマッチングを に き えることである.---
let str = 'a,b-c';
let reg = /([,-])/g;
console.log( str.replace(reg, ' $1 ') ); // a , b - c
---
let reg = /(?\d{3})\d+\k/;
console.log( reg.test('111211') ); // false
console.log( reg.test('1112111') ); // true