我有以下正则表达式
(1*)+(1*0)(ε+11*0)*(11*)
如果最小化,则应为
(1+01)*
但我无法理解最小化,有人可以解释一下吗?
答案 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)*
,x
,y
和a
是任意正则表达式:
b
< => (ab)*a
a(ba)*
< => xa+ya
(x+y)a
< => ε+xx*
x*
< => a*(ba*)*
顺便说一句,最后一个标识通常用于构造正则表达式,这些正则表达式可以有效地匹配带有反斜杠转义的字符串等语法,其中一个天真的方法可能是(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*)*