ES 6エッセンス:正則拡張

5966 ワード

本編では、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);
}

正規オブジェクトの場合、ygフラグのように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