この正規表現:
(a)?b\1c
これは「bc」と一致しません:
(a?)b\1c
一致します。どうしてこれなの?これらのステートメントは同じだと思いました。
少しややこしいですが、見てみましょう。まず、2 番目の正規表現から始めます。
(a?)b\1c
これが一致しようとするとbc
、最初に試行されますが、 in(a?)
がないため、は空の文字列をキャプチャするため、後で を使用して文字列で参照すると、常に可能な空の文字列と一致します。a
bc
()
""
\1
\1
次に、2 番目のケースに進みましょう。
(a)?b\1c
(a)
一致しようとしa
ますが失敗しますが、グループ全体がオプションであるため、正規表現は続行され、 OK(a)?
を見つけようとしますが、何も一致せず、空の文字列であっても一致しないため、一致は失敗します。b
\1
(a)?
したがって、2 つの正規表現の違いは(a?)
、キャプチャ グループでは、後で参照して を使用して正常に一致させることができる空の文字列をキャプチャしますが\1
、(a)?
何にも一致しなかったオプションのキャプチャ グループを作成するため\1
、グループを使用して後で参照すると常に失敗することです。実際に一致したa
.