最小化特定的正则表达式

时间:2016-01-31 10:09:48

标签: regex

我有以下正则表达式

(1*)+(1*0)(ε+11*0)*(11*)

如果最小化,则应为

(1+01)*

但我无法理解最小化,有人可以解释一下吗?

1 个答案:

答案 0 :(得分:3)

首先,对于其他人来说,这是传统的正式计算机科学正则表达式,而不是大多数编程语言中使用的正则表达式语言。在编程语言正则表达式术语中,两个表达式为1*|1*0(|11*0)*11*(1|01)*

现在,问题是:

初始表达式在两个顶级替代项中的表达式的前面和后面都有1*。所以我们可以先将它重写为:

(1*)(ε+0(ε+11*0)*1)(1*)

现在,一般来说,任何正则表达式(ε+x)*的{​​{1}}都只是x。那就是:

x*

现在,(1*)(ε+0(11*0)*1)(1*) 也与x*相同,因此我们可以扩展内部位:

ε+xx*

现在申请(1*)(ε+0(ε+(11*0)(11*0)*)1)(1*) => a(x+y)b

axb+ayb

现在,应用(1*)(ε+01+0(11*0)(11*0)*1)(1*) => (xy)*x

x(yx)*

重新排列parens:

(1*)(ε+01+0(11*0)1(1*01)*)(1*)

并分解出一个共同的前缀:

(1*)(ε+01+(01)(1*)(01)(1*(01))*)(1*)

使用我们之前的扩展,但反过来:

(1*)(ε+(01)(ε+(1*(01))(1*(01))*))(1*)

现在将左(1*)(ε+(01)(1*(01))*)(1*) 带入:

1*

由于((1*)+(1*)(01)(1*(01))*)(1*) 1*相同,我们可以将其写为:

ε+1*

重新安排替代方案:

((ε+1*)+(1*)(01)(1*(01))*)(1*)

应用(1*+(ε+(1*)(01)(1*(01))*))(1*) < => ε+xx*再次等同:

x*

现在,(1*+(1*(01))*)(1*) 可以显示为等同于x*+(x*y)* - 在此处应用:

(x+y)*

现在我们只应用(1+01)*(1*) => (x+y)*x*,我们已经完成了。

(x+y)*

好的,试着找出一个更简单的推导。首先,我需要您接受这些身份,其中(1+01)* xya是任意正则表达式:

  1. b< => (ab)*a

  2. a(ba)*< => xa+ya

  3. (x+y)a< => ε+xx*

  4. x*< => a*(ba*)*

  5. 顺便说一句,最后一个标识通常用于构造正则表达式,这些正则表达式可以有效地匹配带有反斜杠转义的字符串等语法,其中一个天真的方法可能是(a+b)*,但它在大多数正则表达式中效率更高匹配库以使用([^\\"]|\\.)*。无论如何,问题是:

    [^\\"]*(\\.[^\\"]*)*

    好吧,(1*)+(1*0)(ε+11*0)*(11*) 仍然与(ε+x)*相同,所以让我们先这样做:

    x*

    现在应用身份2并将(1*)+(1*0)(11*0)*(11*) 拉到右边:

    1*

    现在,身份1:

    (ε+(1*0)(11*0)*1)(1*)
    

    现在已经准备好身份3:

    (ε+(1*0)1(1*01)*)(1*)
    

    身份1再次给了我们:

    (1*01)*(1*)
    

    现在身份4给了我们想要的结果:

    1*((01)1*)*