正则表达式查找包含偶数个偶数和偶数个b的所有字符串和b?

时间:2015-08-06 12:16:43

标签: regex

是否可以使用正则表达式计算字符串中出现字符的次数? 是否可以使用任何正则表达式来查找包含偶数个偶数和偶数个b的所有字符串?&/?

2 个答案:

答案 0 :(得分:5)

有一个足够简单的有限状态机:它有四种状态:s00,s01,s10和s11,具体取决于你是否消耗了偶数或奇数a s和偶数或奇数b秒。 开始状态(也是结束状态)是通过消耗偶数个ab来达到的状态。 转换函数如下所示:

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)*ba的出现次数)可以通过以b开头的字符串从s00返回s00。您可以根据自己的bs00开始,尽可能多地前往a

答案 1 :(得分:2)

是的,可以使用这个基于前瞻性的正则表达式:

^(?=(?:b*ab*a)*b*$)(?=(?:a*ba*b)*a*$)[ab]*$

RegEx Demo

(?=(?:b*ab*a)*b*$)是预测,通过匹配0个或更多 a子模式,确保输入中有b*a个偶数

即使b

中的(?=(?:a*ba*b)*a*$)没有,也会进行类似的检查