1

PHP で屈折スクリプトを書いているときに、(少なくとも私にとっては) 奇妙な動作に遭遇しました。単語末尾のさまざまなパターンを含む私の正規表現は、最初のオプションが完全に問題ない場合でも、2 番目の許容可能なオプションと一致するようです。

完全な式は次のようになります (特に注意する必要はありません)。

([kpt])\1([aou])$|(?:(n)t)?([auo])$|([aeou][^aeiouyäö]+[aeiou])$|([auo][^aeiouyäö]+)$|([^aeiouyäö])(?!\6)([^aeiouyäö])(e)$|((?:[auo]i|[auo])[^aeiouyäö]*)([aeiouyäö])\10$

言うまでもなく、最初はどこかでミスをしたのではないかと疑い、少しずつ表情を鈍らせて、最終的にこの段階になりました。

([aeiou])$|(.+)$

これは文字通り、「文字列の末尾にある 1 つの母音に一致し、それを後方参照 1 として使用するか、それが失敗した場合は、文字列の末尾の前にある任意の文字に何度でも一致し、それを後方参照 2 として使用する」ことを意味するはずです。

foo式 ( ) の最初の部分が使用されることを期待するような文字列で使用する場合([aeiou])$。代わりに2番目のものが使用され、それは私を混乱させます。

量指定子を削除すると、最初のオプションが使用されます。式は左から右にテストされると思っていましたが、これは式部分の貪欲または特異性と何らかの関係があると推測しています。

誰かが私にこの振る舞いを説明できますか?

4

1 に答える 1

1

文字列の終わりにある1つの母音に一致する[...]、またはそれが失敗した場合は、文字列の終わりの前に任意の文字に何度でも一致する[...]

いいえ、それはそれが意味することではありません。正しい解釈は次のとおりです。

長い方に一致:

  • 文字列の最後に1つの母音
  • 文字列の終わりの前に任意の文字を何度でも

(タイブレークルールが適切に指定されているかどうかはわかりません。)

于 2012-05-23T19:51:38.683 に答える