【问题标题】:Regular expression for strings that cointains a and an even number of b's包含 a 和偶数个 b 的字符串的正则表达式
【发布时间】:2015-09-06 09:46:36
【问题描述】:

如何定义正则表达式以支持以下语言?

L = {w ∈ {a, b}* | w 有偶数个 b }

我尝试创建相关的自动机:

然后我尝试应用该算法从 DFA 获得常规 espression,我得到这个公式:a*ba*b

这是正确的答案吗?

【问题讨论】:

    标签: regex string regular-language language-theory


    【解决方案1】:

    你很接近,但你需要在你的模式的末尾a*。你还需要锚^$来指定你的字符串的开始和结束。然后你可以把你所有的正则表达式在捕获组中,如果b 使用* 匹配任何偶数,a* 匹配零个b

     ^((a*ba*ba*)*|a*)$
    

    注意| 是一个逻辑 OR,使您的正则表达式引擎匹配 (a*ba*ba*)*a*

    Debuggex Demo

    你也可以让它更优雅,但由于你对正则表达式不是很熟悉,所以我建议使用前面的模式。

    例如以下将起作用:

    ^(((a*b){2})*)a*$
    

    【讨论】:

    • 这个(a*U(ba*b)*)*怎么样?
    • @smartmouse 它的效率很低,而且你在模式的末尾有一个b,在你的情况下,你的模式结束没有约束!正如我在你的正则表达式末尾添加了a*
    • "联合:如果 R1 和 R2 是正则表达式,那么 R1 | R2(也写为 R1 U R2 或 R1 + R2)也是一个正则表达式。"来源:cs.rochester.edu/u/nelson/courses/csc_173/fa/re.html。所以U(联合)代表|
    • @smartmouse 在正则表达式中,我们没有任何 U 常规 NFA。那是联盟!但是是的,它们是等价的。
    • @smartmouse: ^(a*ba*b)*a*$ 不接受带有奇数 bs 的字符串。不知道你在说什么。 (a*ba*b)* 表示 a*ba*b 的 0 个或多个实例。 a*ba*b 正好有 2 个 bs。
    【解决方案2】:

    这是最好的解决方案,因为我遵循从 DFA 转换为正则表达式的算法(通过笔完成):

    (a*|ba*b)*
    

    你可以测试它here,你可以通过观看这个video来了解这个算法。

    【讨论】:

      猜你喜欢
      • 2011-04-11
      • 1970-01-01
      • 2015-07-06
      • 2014-03-23
      • 2012-08-20
      • 2018-10-29
      • 2023-03-21
      • 1970-01-01
      • 2012-01-04
      相关资源
      最近更新 更多