正则表达式匹配重复组{0,2}或{0,4}但{0,3}不匹配

rob*_*lls 4 regex pcre

首先,这是使用preg.

字符串我正在尝试匹配:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa b c d xp
Run Code Online (Sandbox Code Playgroud)

我的正则表达式和他们的比赛:

(\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
Run Code Online (Sandbox Code Playgroud)

奇怪的是,如果我删除单个"a",它就有效.另外,(\S*\s*){0,3}\Sp(\S*\s){0,3}\S*p两者兼而有之.

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

TIA!

Dig*_*oss 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"
Run Code Online (Sandbox Code Playgroud)

这让我觉得你找到了一个翻译错误......

但我们现在知道了

  • 您的RE是正确的,您对结果的期望也是如此
  • PHP对回溯有限制,问题是你的表达达到了极限.Ruby只是不检查,或者有不同的限制.