3

正規表現が特定の条件の優先順位をどのように決定するかを理解したいと思います。

次のストリンググラスと正規表現を使用してください。

例 1

(\b\w+?)(?=(?:es)\b)

マッチはガラス製です。

例 2

(\b\w+?)(?=(?:s)\b)

マッチはグラスの上で行われます。

例 3

2つを組み合わせる:

(\b\w+?)(?=(?:es|s)\b)

マッチはガラス製です。

両方が文字列の末尾にある場合、「es」が「s」よりも優先される理由を知りたいです。

4

2 に答える 2

3

+?遅延演算子です。つまり、先に進む前にできるだけ少ない文字に一致させようとします。

通常、演算子は左から右に可能な限り一致しようとし、式の残りの部分が失敗した場合は、短い一致に戻ります。遅延演算子はその逆です。一致する文字をできるだけ少なくし、残りの式が一致しない場合は、現在の一致を拡張します。

したがって、最初の部分 ,は 1 文字 ( ) との(\b\w+?)一致を試み、その後に続くものが であるか であるか、および単語境界であるかを確認します。それが失敗したので、最初の部分が一致するまで、もう 1 文字追加します。このフェーズでは、2 番目の部分が残りの部分と一致します。gessglasses

これを のように怠惰で貪欲な operatorに置き換えると(\b\w+)(?=(?:es|s)\b)、逆になります。glasses最初に、最初の部分 に代入しますが、追加のor(\b\w+)との一致に失敗するため、 にバックトラックし、残りを式の 2 番目の部分と一致させることに成功します。eesglasses

于 2012-12-30T19:47:51.267 に答える
1

優先順位の問題ではありません。正規表現エンジンは、最初に見つかった一致を取得するだけです。気が進まない数量詞を使用しているので、最初の文字を消費した後、それが一致するかどうかを確認するために(\b\w+?)手渡します。(?=(?:es|s)\b)それは失敗するので(\b\w+?)、別のキャラクターを消費し、再び手渡します。最初(?=(?:es|s)\b)に一致できるのは後glassです。したがって、それが一致します。

通常の貪欲な数量詞を使用していた場合、それは異なっていたでしょう。 (\b\w+)最初は文字列全体を消費しますが、(?=(?:es|s)\b)失敗します。したがって、それは元に戻り、最後のを返しsます。その後、先読みはに正常に一致するsため、最終的にはに一致することになりますglasse

ちなみに、正規表現には条件文はありません。あなたが正確に何を指しているのかわかりません:先読み(?=(?:es|s)\b)---または交互---しかし、(?:es|s)条件付きは完全に別のものです

于 2012-12-30T20:06:58.380 に答える