您是否同意正则表达式:
((a|b)*(e|c)*)*
是a,b和c的任意组合?或者你会说c总是在a和b之后。
答案 0 :(得分:1)
通过我总是喜欢在语义上描述正则表达式RE。但是也有一个规则,即“分布式法则”,这对编写清理和优化RE很有帮助:
(P | Q)* == (P*Q*)* == (P* | Q*)*
注意:|
是联合操作,P | Q
与P | 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 组成,自循环标记所有四个符号。如下:
__ || a, b, c, e ▼| ––►((Q0)) Q0 is both initial and final state