如何生成{a,b}字母集中含3的倍数个a的字符串的正则表达式?
匹配字母集{a,b}中3的倍数个a的正则表达式推导
你的表达式存在的问题
你给出的正则表达式 ((ba*)(ba*)(ba*))* 无法覆盖所有符合要求的字符串,比如纯a的字符串aaa(3个a,属于3的倍数)就无法被匹配——因为这个表达式要求每个a序列前必须带有b,但纯a的合法字符串并没有b。
正确的推导步骤(基于DFA)
首先构建对应需求的DFA:
- 定义3个状态,以当前字符串中
a的数量模3的结果区分:- S0:
a的数量是3的倍数(初始状态+终止状态) - S1:
a的数量模3余1 - S2:
a的数量模3余2
- S0:
- 转移规则:
- 任意状态下输入
b,停留在当前状态(b不改变a的计数) - S0输入
a→ S1;S1输入a→ S2;S2输入a→ S0
- 任意状态下输入
接下来用状态消去法推导正则表达式:
- 写出各状态的正则方程:
- R₀ = ε + R₀b + R₂a (ε为空串,对应空输入;R₀b表示S0输入b留原地;R₂a表示S2输入a回到S0)
- R₁ = R₀a + R₁b (S0输入a到S1;S1输入b留原地)
- R₂ = R₁a + R₂b (S1输入a到S2;S2输入b留原地)
- 先解R₁:R₁ = R₀a(b)* (提取公共项,
(b)*表示任意数量的b) - 再解R₂:R₂ = R₁a(b)* = R₀a(b)a(b)
- 代入R₀的方程,化简后得到最终正则:
(b*ab*ab*ab*)*
最终正则表达式解释
(b*ab*ab*ab*)* 的逻辑是:
- 每一组
b*ab*ab*ab*表示:任意数量的b + 1个a + 任意数量的b + 1个a + 任意数量的b + 1个a + 任意数量的b,每组恰好贡献3个a - 外层的
*表示可以重复0次(对应空串,0个a,属于3的倍数)或多次,总a数为3的倍数 - 这个表达式可以匹配所有包含3的倍数个a的{a,b}字符串,包括纯a的合法串(比如
aaa、aaaaaa)、穿插b的串(比如abbaab、bbbaaa)等。
内容的提问来源于stack exchange,提问作者Thej Kiran
相关产品推荐
相关产品推荐

