2

私の正規表現は、、、、、、または文字;の任意のシーケンスと一致する必要がaあります。文字列には、 、 、 の3 つの個別の一致が含まれている必要があります。bcdx"abcdxabcd""abcd""x""abcd"

次の正規表現の違いがわかりません。括弧が結果にどのように影響するかについての詳細な説明を探しています。テスト文字列の場合"abcdxabcd":

  1. /[abcd]+|x/これはうまくいくようです。次の 4 つにはありません。
  2. /(d|[abc])+|x/3 つの一致グループ {d}、{[empty]}、および {d} を返します
  3. /(d|[abc]+)+|x/3 つの一致グループ {d}、{[empty]}、および {d} を返します
  4. /(d|[abc]+)+|(x)/3 つの一致グループ {d, [empty]}、{[empty],x}、および {d,[empty]} を返します。
  5. /((d|[abc]+)+|(x))/3 つの一致グループ {abcd, d, [empty]}、{x,[empty],x}、および {abcd, d, [empty]} を返します。

ここでの質問の一部である、一致グループの概念についてはよく知りません。ここでの私の目標は、機能する表現を見つけることではなく、これらのケースの違いを理解し、機能しないものが実際に何をしているのかを理解することです。

4

1 に答える 1

0

=========/[abcd]+|x/

これは間違いなく機能します。この式は、[abcd]+または|a に一致しxます。文字、、および[abcd]+の 1 つ以上の組み合わせに一致します。リテラルに一致します。abcdxx

したがって、に対して実行するとabcdxabcd[abcd]+最初に に一致しabcd、次にxそのリテラルx[abcd]+一致し、次に 2 番目に一致しabcdます。

これで完全に正しいです。これらは個別の一致です。つまり、/^[abcd]+|x$/正規表現として使用する場合(アンカー^とに注意してください$)、これは一致しないことに気付くでしょうabcdxabcd

=========/(d|[abc])+|x/

これは全く違う表現です。または(d|[abc])+のいずれかに一致し、キャプチャ グループ番号 1 内で一致するものは何でもキャプチャしますが、この式は 1 回以上繰り返されます。そのため、キャプチャ グループには、その中にあるものによって最後に一致したものが含まれます。d[abc]+

したがって、これを に対して実行するとabcdxabcd、もthenとa一致しますが、次にと一致し、これがグループ全体で最後に一致するものであり、グループで一致する値であり、したがって であるグループ 1 と一致します。[abc]bcdd(d|[abc])+dd

whichがx一致しx、グループが何もキャプチャしなかったため、2 番目のキャプチャ グループは空のグループになります。

これで、最後のキャプチャ グループは最初のグループと同じように機能するため、次のように{d}なり{}ます{d}

残りの式を 1 つずつ説明することもできますが、これには多くのタイピングが必要です。これが残りの部分でどのように機能するかを確認していただければ幸いです。

要約:グループが一致しない場合、空の文字列がキャプチャされます(これが実際に Ruby コードで発生するのか、それともわかりやすくするために Rubular によって表示されるだけなのかはわかりません)。特定のグループによってキャプチャされた最後のものはそのままであり、そのグループが何度も一致すると、以前のキャプチャはなくなります。

編集:キャプチャ グループは、その中の式が一致したものをキャプチャまたは記憶するだけなので、後方参照を介して正規表現自体で参照するか、置換文字列で参照できます。

言い忘れていましたが、キャプチャ グループには 1 から始まる番号が付けられ、左から右にカウントされます。

例を示しましょう: 直後に繰り返される文字に一致させたい場合は、次を使用できます。

(.)\1

.単一の文字に一致し、グループ 1 で一致したものをキャプチャします。次に、後方参照と呼ばれる()グループ 1 で一致したものと同じものを一致させようとします。\1

別の例: 次のように、ダッシュで区切られたもう 1 つの文字に一致させたいとしましょう:abc-53そしてそれらを置換文字列で参照したいとします。

あなたは次のようにマッチします:

([^-]+)-([^-]+)

([^-]+)ダッシュではない 1 つまたは複数の文字に一致-する場合、次のように置換文字列でキャプチャされたものを使用します。

$2 == $1

これにより、 に変換abc-53され53 == abcます。

グループのキャプチャやその他の正規表現機能については、多くの説明が必要になる場合があります。詳細については、regular-expressions.infoを確認してください。

于 2013-10-02T16:38:57.880 に答える