ホームページ >ウェブフロントエンド >jsチュートリアル >JS 正規表現の深い理解 -- グループ化

JS 正規表現の深い理解 -- グループ化

高洛峰
高洛峰オリジナル
2017-01-20 13:45:23984ブラウズ

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"]

コード内の (d+) はグループ (サブパターンと呼ぶ人もいます) ですが、すべて同じ意味です。上の例では、test001 が です。ただし、グループ化された一致は、完全一致結果全体 (つまり、test001) からサブパターン d+ に一致する文字を見つけることです。これは明らかに 001 です。 しかし、今日遭遇した状況は次のようなものです

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"]

のようにthis ( d) マッチング結果は 0 です。後でマッチング結果はまだありますが、ここでは可能な限り少数のマッチングを示します

非キャプチャ グループ化

非キャプチャ グループ化とは、いくつかの場所で括弧のペアを使用する必要があることを意味しますただし、これがキャプチャ グループになることは望ましくありません。つまり、このグループが macth exec などの関数によって取得されることは望ましくありません。通常、括弧の前に ?: を追加します。つまり、(?) :pattern)、非キャプチャ グループになるように、

var reg = /test(?:\d)+/;
 var str = 'new test001 test002';
 console.log(str.match(reg));//["test001", index: 4, input: "new test001 test002"]

このように、グループの一致したコンテンツは一致結果に表示されません。つまり、2 番目の項目 1 が欠落しています

。この記事は (d+) と (d)+ に焦点を当てています。この違いは、今日私が陥った落とし穴でもあります。間違いがあれば修正してください。

上記の記事は、JS 正規表現の詳細な理解を提供します -- グループ化は編集者によって共有されたすべての内容です。参考にしていただければ幸いです。また、PHP 中国語 Web サイトをサポートしていただければ幸いです。

JS 正規表現をさらに深く理解するには、グループ化関連の記事については、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。