Regex 为什么我可以转换正则表达式1*0+;1*0(0+;1)*(0+;1)到1*0(0+;1)*?

Regex 为什么我可以转换正则表达式1*0+;1*0(0+;1)*(0+;1)到1*0(0+;1)*?,regex,finite-automata,Regex,Finite Automata,我不太明白,为什么我可以将正则表达式1*0+1*0(0+1)*(0+1)转换为1*0(0+1)*。有人能帮我吗?你可以使用分配定律: (1*0)+(1*0(0+1)*(0+1)) = (1*0ε)+(1*0(0+1)*(0+1)) = (1*0)(ε+(0+1)*(0+1)) 然后应用克莱恩星的定义a*=ε+a*a: = (1*0)((0+1)*) = 1*0(0+1)* 为什么你认为你不能?也许可以尝试一些示例字符串,看看它们是如何匹配的。如果您只是想了解您的模式,请尝试regex10

我不太明白,为什么我可以将正则表达式
1*0+1*0(0+1)*(0+1)
转换为
1*0(0+1)*
。有人能帮我吗?

你可以使用分配定律:

  (1*0)+(1*0(0+1)*(0+1))
= (1*0ε)+(1*0(0+1)*(0+1))
= (1*0)(ε+(0+1)*(0+1))
然后应用克莱恩星的定义
a*=ε+a*a

= (1*0)((0+1)*)
= 1*0(0+1)*

为什么你认为你不能?也许可以尝试一些示例字符串,看看它们是如何匹配的。如果您只是想了解您的模式,请尝试regex101(),我已经看到了自动机,因此我知道它接受相同的字符串。我的问题主要是为什么结尾处的
(0+1)
可以省略,因为这意味着结尾处必须有另一个
0
1
,而
(0+1)*
意味着可能有另一个
0
1
,但不必如此,我认为转换也不有效。第二个正则表达式匹配
0
,第一个不匹配。如果第二个正则表达式末尾有一个
+
而不是
*
,那么我猜它们是等价的。哦,那么
+
在某些(但不是全部?)情况下实际上是