是否可以使用正则表达式计算字符串中出现字符的次数? 是否可以使用任何正则表达式来查找包含偶数个偶数和偶数个b的所有字符串?&/?
答案 0 :(得分:5)
有一个足够简单的有限状态机:它有四种状态:s00,s01,s10和s11,具体取决于你是否消耗了偶数或奇数a
s和偶数或奇数b
秒。
开始状态(也是结束状态)是通过消耗偶数个a
和b
来达到的状态。
转换函数如下所示:
d(s00, a) = s10
d(s00, b) = s01
d(s10, a) = s00
d(s10, b) = s11
d(s01, a) = s11
d(s01, b) = s00
d(s11, a) = s01
d(s11, b) = s10
我们可以取消州s11
:
d(s00, a) = s10
d(s00, b) = s01
d(s10, a) = s00
d(s10, ba) = s11
d(s10, bb) = s10
d(s01, b) = s00
d(s01, aa) = s01
d(s01, ab) = s10
由此我们可以开发一个没有前瞻的正则表达式 通过跟踪返回到开始状态的FSM的所有可能路径,并重复:
( a (bb|ba(aa)*ab)* (a|ba(aa)*b) | b (aa|ab(bb)*ba)* (b|ab(bb)*a) )*
(插入无意义的空格以帮助我跟踪括号的嵌套。)
我们的想法是,如果第一个字符为a
,则您达到s10
;然后您可以通过s10
反复转换到s01
并返回(bb|ba(aa)*ab)*
,最后通过{{1}返回s00
(不重复s10
)或通过a
。类似的模式(仅交换ba(aa)*b
和a
的出现次数)可以通过以b
开头的字符串从s00
返回s00
。您可以根据自己的b
或s00
开始,尽可能多地前往a
。
答案 1 :(得分:2)
是的,可以使用这个基于前瞻性的正则表达式:
^(?=(?:b*ab*a)*b*$)(?=(?:a*ba*b)*a*$)[ab]*$
(?=(?:b*ab*a)*b*$)
是预测,通过匹配0个或更多对 a
子模式,确保输入中有b*a
个偶数
即使b
(?=(?:a*ba*b)*a*$)
没有,也会进行类似的检查