0

您是否同意在正则表达式中:

((a|b)*(e|c)*)* 

是 a、b 和 c 的任意组合吗?或者你会说 c 总是在 a 和 b 之后。

4

1 回答 1

1

通过我总是更喜欢从语义上描述正则表达式 RE。但也有一条规则,其中之一——“分布式法则”,对编写清理和优化的 RE 很有帮助:

(P | Q)*  ==  (P*Q*)*  == (P* | Q*)*

注:|是联合运算,P | QP | Q. 这里 P, Q 是正则表达式。

所以你表达:

     ((a|b)*(e|c)*)*       # P = (a|b)*  and Q = (e|c)*
=>   ((a|b) | (e|c))*      # (P* | Q*)* = (P | Q)*

正如我所说的联合顺序并不重要,所以这里( )是多余的。和

     ((a|b) | (e|c))*     
=>   (a | b | c | e)*

现在 * 表示重复应用 * 的某个模式的任意次数。在上面的表达式中 * 应用于a | b | c | e,并且在每次迭代中您可以选择任何一个符号,这意味着任何符号都出现在正则表达式中的任何其他符号之后 – 这意味着 'a'、'b'、'c 的任意组合', 'e' 是可能的。

它的 FA 非常简单:由单个状态 Q 0和一个标记为所有四个符号的自循环组成。如下:

     __
     || 甲、乙、丙、乙
     ▼|
––►((Q 0 ))

Q 0既是初始状态又是最终状态
于 2014-04-05T19:23:05.707 回答