我知道左派分布规则这个正则表达式: A(B + C)
可写成这样: AB + AC
接下来是我的问题。在这个例子中可以使用左分布规则: A(B + C *)
这样我才能得到: AB + A(C *)
或者我得到这样的东西: AB + AC *
由于
答案 0 :(得分:5)
AB + A(C*)
绝对正确(AB + AC*
几乎肯定也是正确的,具体取决于*
的优先顺序。
有问题的正则表达式是A ( B + C* )
⇔A ( B + (C*) )
。如果我们使用c
= C*
作为替代,我们可以将原始正则表达式编写为A ( B + c )
,现在很明显我们可以使用左分布规则。一次完成所有步骤:
A ( B + C* ) <=> A ( B + (C*) ) <=> AB + A(C*) <=> AB + AC*
(为了教学目的,这里的工作量超出了必要的水平,我使用<=>
来表示“相当于”。)
我们也可以看一下有问题的正则表达式匹配(这不是证明,但它是一个很好的证明它们是等价的):
A(B + C*)
匹配A
,后跟一个B
或任意数量的C
。例如AB
,A
,AC
,ACC
,ACCC
...... AB + A(C*)
匹配AB
或A
,后跟任意数量的C
。例如AB
,A
,AC
,ACC
,ACCC
...... 那些是完全相同的。
答案 1 :(得分:1)
据我所知A(B+C*)
与AB + A(C*)
不同。
第一个表达式匹配ABBBBBBBBBBBB或ABBBBBBBBBBBC等字符串
第二个表达式匹配ABBBBBBBBBBB或ABBBBBBBBBBBACCCCCCCCCCC等字符串
答案 2 :(得分:0)
AB + A(C *)这个是正确的,因为
C *表示0或更多(你有0或多个C) C +表示1个或更多(至少一个c或多于一个)