JS 正規表現を深く理解する ---グループ
以前、正規表現についての入門記事を書きましたが、正規表現については比較的よく理解できたつもりでしたが、今日は私がそうであったためか、別の落とし穴に遭遇しました。十分な注意が必要ではありません。今日は JavaScript 正規表現のグループ化に焦点を当てて説明します。 JS 正規表現について十分に理解していない場合は、ここをクリックして詳細を確認してください。
グループ化は、正規表現で広く使用されています。私が理解しているグループ化は、括弧 () のペアです。グループ化は、次のように分類できます。グループ化をキャプチャする
グループ化をキャプチャすると、match exec などの関数の 2 番目と 3 番目の項目の形式で、対応するグループ化の結果が取得されます。まず例を見てみましょう
var reg = /test(\d+)/; var str = 'new test001 test002'; console.log(str.match(reg));//["test001", "001", index: 4, input: "new test001 test002"]
var reg = /test(\d)+/; var str = 'new test001 test002'; console.log(str.match(reg));//["test001", "1", index: 4, input: "new test001 test002"]
違いは、 (d+ ) が (d)+ に変更され、全体のマッチング結果は test001 のままですが、最初のグループのマッチング結果が異なります。それらの違いをゆっくり分析してみましょう (d+) これはグループ化の状況です。デフォルトではマッチング モードが貪欲モードであるため、一致した結果は 001 で、その外側に括弧のペアが追加されます。これはグループであるため、最初のグループの一致結果は 001 になります。 2 番目の例の (d)+ を見てみましょう。これも貪欲なパターンで、最初に 0 に一致し、次に 0 に一致します。最後は 1 であり、一致の最後まで一致します。最初の例の一致と何ら変わりませんが、ここでのグループ化 (d) は、以前の理解によれば、単一の数値と一致することを意味します。 0. しかし、この理解は間違っています。マッチング全体が貪欲モードであるため、グループ内でできるだけ多くの (d) をマッチングすると、最後に一致した結果 1 が取得されます。非貪欲モードの場合は、できるだけ少ない数のマッチングが行われます
var reg = /test(\d)+?/; var str = 'new test001 test002'; console.log(str.match(reg));//["test001", "0", index: 4, input: "new test001 test002"]
var reg = /test(?:\d)+/; var str = 'new test001 test002'; console.log(str.match(reg));//["test001", index: 4, input: "new test001 test002"]