【问题标题】:Regex to match a string like ababba etc正则表达式匹配像 ababba 这样的字符串
【发布时间】:2021-02-21 04:24:17
【问题描述】:

编写一个表达式来匹配aabaababbaababbabbba等字符串。连续b的数量在每个a之后一个接一个地增加。

我正在学习正则表达式并在这个正则表达式测验中苦苦挣扎了好几天,但仍然无法完全正确。

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

通过案例:

  • a
  • aba
  • ababba
  • ababbabbba
  • ababbabbbabbbba

失败案例:

  • aa
  • abbaa
  • aabb
  • abababa
  • ababbba

这里是what I tried so far

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

我正在考虑使用递归,但我不知道如何使递归在遇到每个 a 后只添加一个 b。所以我的解决方案也通过了abbaababbba等。

有什么想法吗?我错过了什么?

【问题讨论】:

  • 您必须使用正则表达式吗?
  • @TimBiegeleisen 是的,它只接受正则表达式作为答案:(

标签: regex pcre


【解决方案1】:

基于@Michails great answer - 我玩过并试图让它低于 12 个字符。 With 10 (demo)

(b\1|^a)+$

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

【讨论】:

  • 就是这样,最短的答案,12个字符长(包括引号)!
  • 这个答案真的很棒!
  • @Michail 这是基于你的工作。谢谢我可以从你的想法中学习! :)
  • 我不知道\1 可以指代包括自己在内的组,大惊小怪,非常感谢你们。
  • 精彩回答
【解决方案2】:

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

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

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

【讨论】:

  • 这是一个有趣的想法,谢谢。但不幸的是,它通过了abba
  • 我们可以添加 (?=a(?:ba|$)) 以确保它以单个 b 开头
  • 虽然它说答案可能只有 12 个字符长。但我想我不会把它推得太远?
  • 大小肯定会有所改进:)(例如,我提到a$ 3 次)或另一种方法,可能是(?R)(整个模式的递归)。如果它解决了你的问题,你能接受吗?
  • 优秀的解决方案++
【解决方案3】:

你可以试试这个: ^((?(1)b\1|a))+$

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

【讨论】:

  • 有趣!宽度有条件... 脱帽致意:) 给自己留下了深刻的印象。谢谢你。
  • 哇,我花了一段时间才理解,这太聪明了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-05
  • 2013-12-25
  • 1970-01-01
相关资源
最近更新 更多