匹配常规字符串

时间:2013-12-27 09:30:33

标签: regex

我希望匹配ababbabbba之类的字符串,其中b的数量逐一增加,结尾为a

所以它应该匹配:

aba
ababba
ababbabbba
...

我尝试了^(a(\2?b))+a$你可以see here。但它也匹配ababa。我不能再去了,真的与后面的参考混淆了!

修改

嗯,非常感谢@Alan Moore,我让他的正则表达式缩短了一点,最后我也把它介绍给你了:

^(ab((?(2)\2b)))+a$

4 个答案:

答案 0 :(得分:2)

This regex应该有效:

^(?=a)((b*)a(?=\2ba))+\2ba$

故障:

  • ^(?=a)确保字符串以a开头(对下一位至关重要)
  • ((b*)a(?=\2ba))+尽可能匹配以下内容:
    • (b*)a会抓取任意数量的b(包括其中任何一个),并确保旁边有a。需要开头的前瞻,以确保b的数量从0开始。
    • (?=\2ba)检查后面跟着相同数量的b加一,另一个a。这会强制“b的增加数量为1”规则。
  • \2ba$然后确保最后一个前瞻是在字符串的末尾。

答案 1 :(得分:2)

这个正则表达式对我有用:

^(?:a((?(1)\1b|b)))+a$

与大多数正则表达式一样,PHP不喜欢从同一组中引用捕获的组。但是如果它在条件内,那么正则表达式引擎可以看到它不必在组有机会参与比赛之前处理反向引用。如果它选择看,那就是;无论你做什么,一些正则表达式都会拒绝前向引用(因为它们被称为无效语法)。

另一方面,不要试图理解常规语法,常规语言,这类事情。那些引用我们在这里所称的理论 - 纯正则表达式,它们与我们在现实世界中使用的 regexes 非常不同。因此,当有人告诉您无法匹配某个字符串,因为它不是常规时,请不要听。你可能正在和一个没有意识到正规复制是如何实现的计算机科学专业的学生交谈。 ;)

答案 2 :(得分:1)

正则表达式解析regular grammars。他们无法解析不规则的语法。您可以在上面或其他地方的链接中学习常规语法规则,并尝试为您的示例构建常规语法,但我怀疑您是否会成功。您如何表示下一个b链比前一个更长?

如果我是你,我会在这个例子中使用解析器 - 组合器技术。

答案 3 :(得分:1)

我发现了一个较短的正则表达式:

^(^ab|\1b)*a$

哪个匹配a。如果您不想单独使用a,请使用+代替*作为量词。