[JS]#10 RegExpオブジェクト


正規表現
特定の文字の開発、置換、文字列の検証、開発者が制限された検査基準に合格したかどうかを検査するなど、正規表現を使用すると便利です.
正規表現(regular expression)は、パターンを使用して文字列の検索と置換を支援する特定のルールを持つ文字列の集合を表すフォーマット言語です.
RegExpオブジェクトは、モードを使用してテキストを認識するJSでサポートされているオブジェクトです.このオブジェクトは、文字記号と作成者を使用して作成できます.
/ab+c/i
new RegExp(/ab+c/, 'i');   // 리터럴
new RegExp('ab+c', 'i');   // 생성자
  • 文字記号のパラメータは、二重斜線で囲まれ、引用符は使用されません.
  • コンストラクション関数のパラメータには斜線はありませんが、引用符を使用します.
  • lastIndex
    LastIndexはRegExpオブジェクトの内部投影の1つで、一致する開始位置を設定します.デフォルト値は0としてマークされます.
    きほんしようけいしき
    const value = "ABC";
    const obj = new RegExp("A", "g");
    console.log(obj.test(value));
    const reg = /A/g;
    console.log(reg.test(value));
    // true
    // true
  • const obj = new RegExp("A", "g");
    ◇RegExpインスタンスを生成し、Aで試合対象と組み合わせる.2番目のパラメータ「g」は、グローバルフラグであり、すべてが一致することを示す.
  • console.log(obj.test(value));
    =objで設定したAをABCと照合し、Aが存在するか否かを検索するのでtrueを返す.
  • const reg =/A/g;
    正規表現文字を使用する形式ではnew演算子は使用されませんが、1番と同じです.
  • gフラグ
    const value = "ABABA", obj = /B/g;
    console.log(obj.test(value) +": "+obj.lastIndex);
    console.log(obj.test(value) +": "+obj.lastIndex);
    console.log(obj.test(value) +": "+obj.lastIndex);
    // true: 2
    // true: 4
    // false: 0
  • obj.test(value)
    BはABABにあるので、組み合わせてtrueに戻ります.
  • obj.lastIndex
    =lastIndex値出力2.Bが一致するインデックスは1であり、2が出力される理由は1が一致するインデックスであり、lastIndexは次の一致を開始するインデックスを格納するため、+1は2に設定される.
  • obj.test(value)
    lastIndex値が2のため、ターゲット文字列(ABABA)の2番目のインデックスからBが一致します.
  • obj.lastIndex
    ◇2番目のインデックスからBを3番目のインデックスと一致させるので、+1と4はlastIndexで設定して出力します.
  • obj.test(value)
    ◇4番目のインデックスから、Bを組み合わせて、もう組み合わせないのでfalseが出力されます.
  • obj.lastIndex
    一致しない場合、lastIndex値は0です.(初期状態)
  • gフラグを無効にする
    LastIndexプロパティの値は、開発者が値を指定しても常にゼロインデックスから一致します.
    const value = "ABABA", obj = /B/;
    console.log(obj.test(value) +": "+obj.lastIndex);
    obj.lastIndex = 2;
    console.log(obj.test(value) +": "+obj.lastIndex);
    console.log(obj.test(value) +": "+obj.lastIndex);
    // true: 0
    // true: 2
    // true: 2
  • yフラグ
    RegExpオブジェクトは、タグの設定に応じて異なる結果値を表示できます.
    gタグはlastIndexを更新し、プロセス全体で文字列を検索および置換できます.タグがない場合は、毎回最初から一致します.
    yタグもlastIndexを使用しますが、gタグとは異なります.gフラグがlastIndexからマッチングを開始すると、yフラグはlastIndex位置にマッチングする.
    すなわち、gフラグがlastIndexの位置から終了するまで、1つの文字列が一致し、一致しない場合、lastIndexは0であり、一致する場合、その位置+1はlastIndexである.
    yフラグはlastIndexの位置のみで一致し、一致が成功した場合はlastIndexで0を設定し、後のループではなく0を設定します.
    const value = "AABBA", obj = /A/y
    console.log(obj.test(value) + ": "+ obj.lastIndex);
    console.log(obj.test(value) + ": "+ obj.lastIndex);
    console.log(obj.test(value) + ": "+ obj.lastIndex);
    // true: 1
    // true: 2
    // false: 0
  • console.log("1-"+obj.test(value) + ": "+ obj.lastIndex)
    =default lastIndexは0で、AABBAの最初のインデックスの値Aとobjをペアリングし、結果はtrueを返し、lastIndexは0+1、1である.
  • console.log("2-"+obj.test(value) + ": "+ obj.lastIndex)
    =lastIndexは現在1であり、AABBAの最初のインデックスにある文字はAであり、objと一致してtrueを返します.だからlastIndexは1+1になって2になる
  • console.log("3-"+obj.test(value) + ": "+ obj.lastIndex)
    lastIndexは2なので、文字列の2番目の位置からマッチングします.文字はBなので、マッチングの結果はfalseです.したがって、falseが返され、lastIndexは0になります.
  • 文字列valueを表示すると、最後の文字はAです.ただし、中間のBに遭遇するとfalseとなり、lastIndexは0となるため、最後の文字に一致しません.連続文字モードを検証する場合は、yタグが便利です.
    任意指定
  • lastIndex値
    yタグを使用すると、propertyのsticky propertyがtrueになり、条件文のstickyがyタグとして確認された場合、lastIndexを任意に変更してマッチングを試みることができます.
    const value = "AABBA", obj = /A/y
    if(obj.sticky)
      obj.lastIndex = 4;
    console.log(obj.test(value) + ": "+ obj.lastIndex);
    // true: 5
  • uフラグ、sフラグ
    uマーク
    uフラグは、正規表現のパターンをUnicodeのコード点に変換してマッチングする.また、内部構成ではUnicode構成がtrueに設定されている.uタグを使用しない場合は、コードポイントを変換するのではなく、文字を使用してマッチングします.
    const obj = new RegExp("\u{31}\u{32}", "u");
    const obj2 = new RegExp(String.raw `\u{31}\u{32}`)
    console.log(obj.test("12"));           //true
    console.log(obj.unicode);              //true
    console.log(obj2.test("12"));          //false
    console.log(obj2.unicode);             //false
    console.log(/\u{1f418}/u.test("🐘"));  //true
    console.log(/\u{1f418}/.test("🐘"));   //false
    ひょうしき
    ✔ES 2018サポート開始
    従来の正規表現のポイント(ポイント)すべての文字の組み合わせですが、改行文字は組み合わせられていません.ただし、ES 2018でサポートされているSタグの使用が開始されると、改行文字にもマッチし、内部PropertyであるdotAll Propertyとしてtrueに設定される.
  • 改行
    U+000A Line Feed(LF)("\n")
    U+000D Carriage Return(CR)("\r")
    U+2028 Line Separator
    U+2029 Paragraph Separator
  • const text = `line
    줄을 바꿈`;
    // before
    console.log(/[\s\S]+/.test(text));
    console.log(/[^]+/.test(text));
    // true
    // true
    // s flag
    const obj = new RegExp(".+", "s");
    console.log(obj.test(text));
    console.log(obj.dotAll);
    // true
    // true