在php中编写一个变形脚本时,我遇到了一个奇怪的(至少对我来说)行为。似乎我的正则表达式包含许多不同的单词结尾模式匹配第二个可接受的选项,即使第一个完全没问题。
完整的表达式是这样的(你真的不需要注意这一点):
([kpt])\1([aou])$|(?:(n)t)?([auo])$|([aeou][^aeiouyäö]+[aeiou])$|([auo][^aeiouyäö]+)$|([^aeiouyäö])(?!\6)([^aeiouyäö])(e)$|((?:[auo]i|[auo])[^aeiouyäö]*)([aeiouyäö])\10$
毋庸置疑,我首先怀疑我在某个地方犯了一个错误,所以我一点一点地贬低了表情,最后到了这个阶段:
([aeiou])$|(.+)$
字面意思应该是“在字符串末尾匹配一个元音并将其用作反向引用1,或者如果失败,则在字符串结尾前任意次数匹配任何字符并将其用作反向引用2”
当与foo
之类的字符串一起使用时,我希望使用表达式的第一部分(([aeiou])$
)。相反,第二个被使用,这让我感到困惑。
如果删除量词,则使用第一个选项。我猜这必须对表达部分的贪婪或特异性做一些事情,尽管我认为表达式是从左到右测试的。
有人可以向我解释这种行为吗?
答案 0 :(得分:1)
匹配字符串末尾的一个元音[...]或如果失败,在字符串结束之前任意次匹配任何字符[...]
不,这不是它的意思。正确的解释是:
匹配 的更长时间:
- 字符串末尾的一个元音
- 在字符串结尾之前的任何字符
(我不知道是否明确规定了打破平局规则。)