正则表达式匹配ababba等字符串

时间:2020-11-09 08:51:40

标签: regex pcre

编写一个表达式以匹配诸如aabaababbaababbabbba等字符串。连续的b的数量在之后每个a

我正在学习正则表达式,并在正则表达式测试中苦苦挣扎了几天,但仍然不能完全正确。

根据描述,正则表达式应匹配并在以下情况下失败:

合格案例:

  • a
  • aba
  • ababba
  • ababbabbba
  • ababbabbbabbbba

失败案例:

  • aa
  • abbaa
  • aabb
  • abababa
  • ababbba

这里是what I tried so far

^a((b(?2)?)a)?(?1)*$

我正在考虑使用递归,但我不知道如何在满足每个b之后仅添加一个a来实现递归。因此,我的解决方案还通过了abbaababbba等。

有什么想法吗?我想念什么?

3 个答案:

答案 0 :(得分:9)

基于@Michails great answer-我玩了游戏,并尝试将其限制在12个字符以下。 With 10 (demo)

(b\1|^a)+$

我还是想知道它是否工作正常。肯定是faster with start anchor (demo)

答案 1 :(得分:6)

^(?=aba|a$)(?:a(b+)(?=a\1ba|a$))*a$

  • ^从一开始:
  • (?=aba|a$)将以aba开头,以确保它以一个b开头(不匹配,只有一个检查)
  • a(b+) a后面是几个b(捕获b的数量)
  • (?=a\1ba)此abbb后面必须紧跟着a,再是b,然后是a
  • |a$除了课程中的最后一个课程,后面紧跟着一个课程
  • *重复这种“ ab +每次再加一个b”的模式
  • a$匹配最后一个a

https://regex101.com/r/J5rXH9/3上进行测试

答案 2 :(得分:6)

您可以尝试以下操作: ^((?(1)b\1|a))+$

https://regex101.com/r/TGBHzj/1