写一个表达式来匹配像
a
,aba
,ababba
,ababbabbba
等字符串。 连续的数量b
在每个 之后逐一增加a
。
我正在学习正则表达式并在这个正则表达式测验中挣扎了好几天,但仍然无法完全正确。
根据描述,正则表达式应该匹配并失败以下情况:
a
aba
ababba
ababbabbba
ababbabbbabbbba
aa
abbaa
aabb
abababa
ababbba
^a((b(?2)?)a)?(?1)*$
Run Code Online (Sandbox Code Playgroud)
我正在考虑使用递归,但我不知道如何b
在a
满足每个递归后只添加一个。所以,我的解决方案也通过abba
和ababbba
等。
有任何想法吗?我错过了什么?
基于@Michails 很好的答案- 我玩过并试图将其限制在 12 个字符以下。带 10 个(演示)
(b\1|^a)+$
Run Code Online (Sandbox Code Playgroud)
我仍然想知道,它是否工作正常。使用 start anchor (demo)肯定会更快。
^(?=aba|a$)(?:a(b+)(?=a\1ba|a$))*a$
^
从一开始就 :(?=aba|a$)
将从 aba 开始以确保它以一个 b 开头(不匹配,只是一个检查)a(b+)
一个 a 后面跟着几个 b(捕获 b 的个数)(?=a\1ba)
这个 abbb 后面必须跟 a,再一个 b,然后是 a|a$
当然,除了最后一个,后面只是最后一个*
重复这种“每次增加一个 b”的模式a$
匹配最后一个在https://regex101.com/r/J5rXH9/3上测试