7

正規表現エンジンが と照合するプロセスを説明できる人はいます(aa)+\1aaaaaa? +orを使用するときにバックトラッキングと呼ばれるプロセスがあることは知っていますが*、この例でどのように機能するかはわかりません。

4

3 に答える 3

14

量指定子をキャプチャ グループの外に置くと、そのパターンと一致する文字列全体が量指定子でキャプチャされません。むしろ、パターンが一致した最後の繰り返しだけに一致します。

そのため、キャプチャ グループで(aa)+はキャプチャしませんaaaaが、最後のペア - だけをキャプチャしてaa、残りの正規表現パターンを満たすことができます。

したがって、(aa)+\1では、パターンが最初に -aaaaに一致し、次に後方参照\1がキャプチャされたグループ - に一致しますaa。したがって、文字列 - に一致しますaaaaaa。Not(aa)+はすべてのa'sに一致するわけではありません\1

正規表現の分割は次の(aa)+\1とおりです。

  • (aa)+文字列の最初の 2 つに一致しaaます。残りの文字列 - aaaa.
  • にマッチするものは他にもある(aa)+ので、次のマッチに進みaaます。残りの文字列 - aa.
  • ここでも(aa)+、残りの文字列に一致させることができます。したがって、次の に一致しaaます。残りの文字列 - "". 量指定子はデフォルトで欲張りに振る舞うことを思い出してください。それらは可能な限り一致します。
  • 今、(aa)+これ以上一致することはできません。
  • 次のパターンは\1です。しかし、一致するものは何も残っていません。
  • によって一致した最後のパターンをバックトラックし(aa)+ます。残りの文字列 - "aa".
  • \1は再び一致を試み、一致に成功しました。これは、現在1 番目のキャプチャ グループaaにあるものであるためです。

参考文献:

于 2013-08-24T14:59:32.087 に答える
4

+数量詞は「1以上」を意味します。これ\1は、量指定子が参照しているものと同じものです。効果的に言えば、「グループ aa、1 回以上、次にもう 1 回」と言っているのです。これは「2回以上」と同じです。

したがって、正規表現は次のように明確になる場合があります。/(aa){2,}/

aaaaaaグループの 3 つのセットであるため、aa正規表現は文字列と一致します。

于 2013-08-24T14:58:44.003 に答える
4

シナリオ:

aa           # the group is matched
aaaa         # the group is repeated once, cause the + quantifier
aaaaaa       # the group is repeated once again, always cause 
             # the + quantifier (and because it is greedy and take all it can.)
             # But since all the characters are eaten, and there is \1
             # the pattern will fail.
aaaa         # the regex engine must backtrack to try another way because of \1
aaaaaa       # you are arrived! (the 2 last "a" are for the \1

バックトラックを禁止する所有量指定子 (++) を使用して、この動作を確認できます。

(aa)++\1            # will never match
于 2013-08-24T15:07:40.067 に答える