私は以前に正規表現を始めることについての記事を書きました。私は通常の表現に比較的精通していると思っていましたが、今日は別の落とし穴に遭遇しました。たぶんそれは私が十分に注意していなかったからだったのかもしれません。今日は、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+)これはグループ化の状況です。デフォルトでは、マッチングパターンは貪欲なパターン、つまりできるだけ多くの一致であるため
すべての /D+マッチの結果は001です。その後、一対のブラケットが外側に追加されます。これは、グループを意味するため、最初のグループで一致した結果は001です。
2番目の例で(/d)+を見てみましょう。これも貪欲なパターンです。最初に、最初に0と0と一致し、1の終わりにも一致します。
最初の例では試合との違いはないようですが、ここでのグループ化(/d)は、単一の数字と一致することを意味します。
私の以前の理解によると、試合が最初に0だった結果は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"]]
このようにして、一致する結果(/d)は0です。
非キャプチャグループ
var reg =/test(?:/d)+/; var str = 'new test001 test002'; console.log(str.match(reg)); // ["test001"、index:4、input: "new test001 test002"]]
非キャプチャグループは、一部の場所で一対のブラケットが必要であることを意味しますが、キャプチャグループになりたくないため、Macth Execのような機能によってこのグループを取得したくないということです。
通常、?:(?:パターン)ブラケット内の追加は、キャプチャ以外のグループになります。
このようにして、試合の試合の結果に一致するコンテンツはありません。つまり、2番目のアイテムが欠落していることを意味します。
この記事では、(/d+)と(/d)+の違いを説明することに焦点を当てています。これは、今日私が踏んだピットでもあります。間違いがある場合は、自由に修正してください。