5

最近、正規表現で遊んでいますが、phpでpreg_match_allを使用すると、期待どおりに機能しないことが1つあります。

http://www.solmetra.com/scripts/regex/index.phpでオンライン正規表現ツールを使用しています。

私が使用している正規表現はです/(?>x|y|z)w/。私はそれを一致させていabyxwます。失敗することを期待していますが、成功し、一致しxwます。

アトミックグループ化を使用しているため、失敗することが予想されます。アトミックグループ化は、複数のソースから読み取ったものから、バックトラックを防ぎます。私が正確に期待しているのは、エンジンyがオルタネーションとのマッチングを試みて成功することです。後でw、正規表現リテラルwとの照合を試みて失敗します。これは、に遭遇したためxです。その後、通常はバックトラックしますが、アトミックグループ化のため、この場合はバックトラックしないでください。だから私が知っていることから、それはyこの原子グループと一致しようとし続けるべきです。しかし、そうではありません。

この状況に光を当てていただければ幸いです。:)

4

1 に答える 1

4

これは少し注意が必要ですが、一致するものが見つからない場合に正規表現で実行できることが2つあります。

  • 開始位置を進める-インデックスで一致が成功しない場合は、インデックスiから再試行されi+1、文字列の最後に到達するまで続行されます。
  • バックトラック-正規表現で繰り返しまたは交互が使用されている場合、正規表現エンジンは失敗した一致の一部を破棄し、繰り返しの数を増減するか、交互の別の要素を使用して再試行できます。

アトミックグループはバックトラックを防ぎますが、開始位置の前進には影響しません。

この場合、エンジンがy最初の文字として一致しようとすると一致は失敗しますが、その後、エンジンは次に進みxw、一致する文字列の残りの部分として表示されます。

于 2013-03-07T17:28:30.510 に答える