【发布时间】:2015-09-06 09:46:36
【问题描述】:
如何定义正则表达式以支持以下语言?
L = {w ∈ {a, b}* | w 有偶数个 b }
我尝试创建相关的自动机:
然后我尝试应用该算法从 DFA 获得常规 espression,我得到这个公式:a*ba*b。
这是正确的答案吗?
【问题讨论】:
标签: regex string regular-language language-theory
如何定义正则表达式以支持以下语言?
L = {w ∈ {a, b}* | w 有偶数个 b }
我尝试创建相关的自动机:
然后我尝试应用该算法从 DFA 获得常规 espression,我得到这个公式:a*ba*b。
这是正确的答案吗?
【问题讨论】:
标签: regex string regular-language language-theory
你很接近,但你需要在你的模式的末尾a*。你还需要锚^和$来指定你的字符串的开始和结束。然后你可以把你所有的正则表达式在捕获组中,如果b 使用* 匹配任何偶数,a* 匹配零个b:
^((a*ba*ba*)*|a*)$
注意:| 是一个逻辑 OR,使您的正则表达式引擎匹配 (a*ba*ba*)* 或 a*。
你也可以让它更优雅,但由于你对正则表达式不是很熟悉,所以我建议使用前面的模式。
例如以下将起作用:
^(((a*b){2})*)a*$
【讨论】:
(a*U(ba*b)*)*怎么样?
b,在你的情况下,你的模式结束没有约束!正如我在你的正则表达式末尾添加了a*。
U(联合)代表|
U 常规 NFA。那是联盟!但是是的,它们是等价的。
^(a*ba*b)*a*$ 不接受带有奇数 bs 的字符串。不知道你在说什么。 (a*ba*b)* 表示 a*ba*b 的 0 个或多个实例。 a*ba*b 正好有 2 个 bs。