4

首先,这是使用 preg。

我要匹配的字符串:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa b c d xp

我的正则表达式及其匹配项:

(\S*\s*){0,1}\S*p = "d xp"
(\S*\s*){0,2}\S*p = "c d xp"
(\S*\s*){0,3}\S*p = NO MATCH (expecting "b c d xp"
(\S*\s*){0,4}\S*p = entire string
(\S*\s*){0,5}\S*p = entire string

奇怪的是,如果我删除一个“a”它就可以了。也,(\S*\s*){0,3}\Sp(\S*\s){0,3}\S*p两者都有效。

有人可以解释为什么第三种情况导致没有匹配而不是“bcd xp”吗?

蒂亚!

4

2 回答 2

7

好问题。

我尝试了另一种也具有 Perl RE 语法的语言 Ruby,它返回了预期的字符串:

$ irb
>> s='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa b c d xp'
=> "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa b c d xp"
>> s[/(\S*\s*){0,3}\S*p/]
=> "b c d xp"

这让我觉得你发现了一个解释器错误......

但我们现在知道

  • 您的 RE 是正确的,正如您对其结果的期望一样
  • PHP 对回溯有限制,问题是您的表达式达到了限制。Ruby 只是不检查,或者有不同的限制。
于 2009-10-29T02:21:11.203 回答
2

preg_last_error()返回 PREG_BACKTRACK_LIMIT_ERROR,因此增加回溯限制应该可以解决问题。尝试

 ini_set('pcre.backtrack_limit', 500000);
于 2009-10-29T05:12:51.027 回答