1

在 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])$) 的第一部分。相反,使用了第二个,这让我感到困惑。

如果删除量词,则使用第一个选项。我猜这与表达式部分的贪婪或特异性有关,尽管我认为表达式是从左到右测试的。

有人可以向我解释这种行为吗?

4

1 回答 1

1

匹配字符串末尾的一个元音 [...] 或者如果失败,则在字符串末尾匹配任意次数的任意字符 [...]

不,不是这个意思。正确的解释是:

匹配较长的

  • 字符串末尾的一个元音
  • 字符串结束前任意次数的任意字符

(我不知道是否明确规定了平局规则。)

于 2012-05-23T19:51:38.683 回答