找到正则表达式的补语

时间:2013-03-16 17:29:44

标签: regex complement

我的练习表上有一个问题是找到两个公式的补充

(1)(aa|bb)*

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

两者的补充在我看来a* | b*,仅表示a或仅b

2 个答案:

答案 0 :(得分:6)

您需要完成常规程序:

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

我不会向您显示结果,因为它是运动,但我会向您显示第一个公式(aa|bb)*的DFA:

Formula 1

通过此,您可以清楚地看到a*b*无法提供正确的结果。您将永远不会以 Trap 状态结束(它将成为补充正则表达式中的终端状态),并且您最终可能处于状态 2a / 2b (在补充正则表达式中变为 - 终端状态)。

答案 1 :(得分:0)

simply (aa+bb)* will contain sample strings such as null, aa , aaaa , bb , bbbb ,aabb, bbaa and so on observe that all strings that can be formed are of even length and a and b can be any order , so complement should contain all odd length strings 

((A + B)(A + B))*(A + B)