【问题标题】:find complement of regular expression查找正则表达式的补码
【发布时间】:2013-03-16 17:29:44
【问题描述】:

我的练习纸上有一道题,求两个公式的补集

(1)(aa|bb)*

(2)(a|b)(aa|bb)(a|b).

在我看来,两者的互补是a* | b*,意思是只有a's 还是只有b's?

【问题讨论】:

标签: regex complement


【解决方案1】:

您需要通过通常的程序:

  • 将正则表达式转换为 NFA。
  • 将 NFA 转换为 DFA。对于简单的情况,很容易(手动)将正则表达式直接转换为 DFA。
  • 将所有非终端状态转换为终端状态,反之亦然。
  • 将补充 DFA 转换为正则表达式。 This is one detailed example of such conversion

我不会给你看结果,因为它是运动,但我会给你看第一个公式(aa|bb)*的DFA:

由此,您可以清楚地看到a*b* 不会给出正确的结果。你永远不会进入 Trap 状态(在补充正则表达式中成为终止状态),你可能会进入状态 2a /2b(在补充正则表达式中变为-终结状态)。

【讨论】:

  • 你用什么来制作这张图?
【解决方案2】:

简单地 (aa+bb)* 将包含示例字符串,例如 null、aa、aaaa、bb、bbbb、aabb、bbaa 等观察可以形成的所有字符串的长度都是偶数,并且 a 和 b 可以是任意顺序,所以补码应该包含所有奇数长度的字符串 ((a+b)(a+b))*(a+b)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-13
    • 1970-01-01
    • 2011-08-03
    相关资源
    最近更新 更多