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

标签 regex pcre

首先,这是使用 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两者都工作。

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

蒂亚!

最佳答案

好问题。

我尝试了另一种也有 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 只是不检查,或者有不同的限制。
  • 关于正则表达式匹配重复组 {0,2} 或 {0,4},但 {0,3} 不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1641211/

    相关文章:

    正则表达式 - 捕获不包括周围部分匹配内容的重复组

    php - 使用 preg_replace 将单词的每个首字母大写

    逗号分隔列表中值范围的正则表达式

    java - 如何删除字符串中问号(?)后面的尾随字符?

    java - 如何使用 Java 正则表达式解析骰子符号?

    java - 删除 Java 中的空格和特殊字符

    c - Linux C LibPCRE 输出独特的结果

    javascript - 为什么 "abcdef"没有被(?=abc)def匹配到,却被abc(?=def)匹配到了?

    javascript - 将 jquery 正则表达式匹配中的匹配值分配给字符串变量