简化正则表达式

时间:2013-11-17 17:50:51

标签: regex computer-science

我想简化这个正则表达式:

0*|0*1(ε|0*1)*00*

我使用了这个身份:

(R+S)*=(R*S*)*=(R*+S*)*

并且不能比这更好:

0*|0*1(0*1)*00* [(ε|0*1)*=(ε*0*1)*=(0*1)*]

这个正则表达式可以更简化,怎么样?我不知道还能做什么。 :)

编辑1 :我将+更改为|,因为+可能代表“一次或多次”,旁边的替换现在由|。 符号说明:

1) ε stands for empty word
2) * is Kleene star
3) AB is just a concatenation of languages of regular expressions A and B.

编辑2 :正式证明这减少为(0 * 1)* 0 + |ε:

  0*|0*1(ε|0*1)*00* = 
= 0*|0*1(0*1)*0+ =
= 0*|(0*1)+0+ =
= 0+|ε|(0*1)+0+ =
= ε0+|(0*1)+0+|ε
= (ε|(0*1)+)0+|ε
= (0*1)*0+|ε

有没有办法将它进一步减少到(0|1)*0|ε

3 个答案:

答案 0 :(得分:4)

(更新:请参阅编辑历史记录,了解以前错误尝试的漫长而悲伤的故事)。

我(现在)相信这会减少到:

ε|(0|1)*0

换句话说,要么:

  • 空字符串
  • 以0结尾的任何1和0字符串

证明这是另一回事。 ; - )

答案 1 :(得分:4)

我认为它缩减为(0*1)*0+|

答案 2 :(得分:2)

我设法正式将正则表达式减少到ε|(0 | 1)* 0。 这是证据:

 0*|0*1(ε|0*1)*00* = 
= 0*|0*1(0*1)*0+ =
= 0*|(0*1)+0+ =
= 0+|ε|(0*1)+0+ =
= ε0+|(0*1)+0+|ε =
= (ε|(0*1)+)0+|ε =
= (0*1)*0+|ε =
= (0*1)*0*0|ε = #
= (0|1)*0|ε

诀窍是在标记为#的步骤中使用身份(A*B)*A* = (A|B)*时我不知道问题。