Write an expression to match strings like
a
,aba
,ababba
,ababbabbba
, etc. The number of consecutiveb
increases one by one after eacha
.
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:
a
aba
ababba
ababbabbba
ababbabbbabbbba
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?
To match a character having special meaning in regex, you need to use a escape sequence prefix with a backslash ( \ ). E.g., \. matches "." ; regex \+ matches "+" ; and regex \( matches "(" . You also need to use regex \\ to match "\" (back-slash).
The character + in a regular expression means "match the preceding character one or more times". For example A+ matches one or more of character A. The plus character, used in a regular expression, is called a Kleene plus .
Based on @Michails great answer - I played and tried to get it below 12 characters. With 10 (demo)
(b\1|^a)+$
Still I wonder, if it works fine. It will be definetly faster with start anchor (demo).
You would try this:
^((?(1)b\1|a))+$
https://regex101.com/r/TGBHzj/1
^(?=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 aTest it on https://regex101.com/r/J5rXH9/3
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With