Regex to match a string like ababba etc

Viewed 281

Write an expression to match strings like a, aba, ababba, ababbabbba, etc. The number of consecutive b increases one by one after each a.

I'm learning regex and struggling with this regex quiz for several days but still couldn't quite get it right.

According to the description, the regex should match and fail following cases:

Pass cases:

  • a
  • aba
  • ababba
  • ababbabbba
  • ababbabbbabbbba

Fail cases:

  • aa
  • abbaa
  • aabb
  • abababa
  • ababbba

Here's what I tried so far

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

I'm thinking to use recursion but I don't know how to make the recursion add just one b after each a is met. So my solution also passes abba and ababbba etc.

Any ideas? What did I miss?

3 Answers

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

  • ^ From the beginning :
  • (?=aba|a$) Will start by aba to make sure it starts with one b (no match, just a check)
  • a(b+) An a followed by several b (capture the number of b)
  • (?=a\1ba) this abbb must be followed by a, one more b, then a
  • |a$ except for the last one of course, which is simply followed by the last a
  • * repeat this pattern of "ab+ with one more b each time"
  • a$ match the final a

Test it on https://regex101.com/r/J5rXH9/3

Related