サーチ…


基本

逆参照は、キャプチャグループによって以前に照合された同じテキストと一致するために使用されます。これは、パターンの以前の部分を再利用し、2つの文字列の一致を保証するのに役立ちます。

たとえば、文字列にハイフン、スラッシュ、空白などの区切り文字、小文字、別の区切り文字、0から9の別の数字などの文字列が0から9までの数字を持つことを確認しようとしている場合、次のような正規表現を使用してください:

[0-9][-/ ][a-z][-/ ][0-9]

これが一致し1-a-4それはまた 、マッチし1-a/4または1 a-4セパレータを一致させたい場合は、 キャプチャグループとバックリファレンスを使用できます。バックリファレンスは、指定されたキャプチャグループ内の一致を確認し、バックリファレンスの場所が正確に一致するようにします。

同じ例を使って、正規表現は次のようになります。

[0-9]([-/ ])[a-z]\1[0-9]

\1はパターン内の最初のキャプチャグループを示します。この小さな変更により、正規表現は、今と一致する1-a-4または1 a 4ではなく1 a-4または1-a/4

バックリファレンスに使用する番号は、キャプチャグループの場所によって異なります。番号は1から9まであり、キャプチャグループを数えて見つけることができます。

([0-9])([-/ ])[a-z][-/ ]([0-9])
|--1--||--2--|          |--3--|

ネストされたキャプチャグループは、このカウントをわずかに変更します。最初に外部キャプチャグループをカウントし、次のレベルをカウントして、ネストから離れるまで続行します。

(([0-9])([-/ ]))([a-z])
 |--2--||--3--|
|-------1------||--4--|

あいまいな逆参照

問題:特定の形式のテキストを一致させる必要があります。たとえば、次のようになります。

1-a-0
6/p/0
4 g 0

これは数字、区切り文字( -/ 、またはスペースのいずれか)、文字、同じ区切り文字、およびゼロです。

Naïvesolution: 基本例の正規表現を適用すると、この正規表現が思い浮かぶ:

[0-9]([-/ ])[a-z]\10

しかし、それはおそらく動作しません。ほとんどの正規表現のフレーバは9つ以上のキャプチャグループをサポートしていますが、キャプチャグループが1つしかないので、それほどスマートではありません。 \10はグループ1の後ろにリテラル0続く必要があります。ほとんどのフレーバーは、グループ10の逆参照として扱います。グループ10がないため、それらのうちのいくつかは例外をスローします。残りは単に一致することができません。

この問題を回避する方法はいくつかあります。 1つは、 名前付きグループ (および名前付き後方参照)を使用することです。

[0-9](?<sep>[-/ ])[a-z]\k<sep>0

あなたの正規表現言語がそれをサポートしているなら、 \g{n}nは数字です)という形式は逆参照番号を中括弧で囲んで後ろの数字と区別することができます:

[0-9]([-/ ])[a-z]\g{1}0

別の方法は、拡張正規表現の書式設定を使用して、重要でない空白で要素を区切ることです(Javaでは括弧内のスペースをエスケープする必要があります)。

(?x) [0-9] ([-/ ]) [a-z] \1 0

正規表現のフレーバーでこれらの機能がサポートされていない場合は、非キャプチャグループのような不要で無害な構文を追加できます。

[0-9]([-/ ])[a-z](?:\1)0

...またはダミーの量限定子(これは恐らく{1}が役に立つ唯一の状況です):

[0-9]([-/ ])[a-z]\1{1}0


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow