编译器-DFA(a + b)* vs(a | b)*两者之间有什么区别?

时间:2015-11-10 16:47:54

标签: regex compiler-construction dfa

do(a + b)*和(a | B)*产生相同的DFA和相同的输出? 在数学中,无论涉及单词“或”,我们都使用加法运算符。 那么这是否意味着两个表达式都是等价的?

2 个答案:

答案 0 :(得分:1)

没有

(a+b)*匹配至少一个a后跟b,零次或多次。因此,为了匹配非空字符串,字符串必须在某些时候包含ab

(a|B)*需要ab,零次或多次。它可以匹配空字符串,所有a s的字符串,所有b s的字符串等。

第二个表达式匹配以下示例中的整个字符串:aaaaaabbbbbb第一个表达式在技术上匹配(因为零长度字符串匹配),但与整个字符串不匹配。被捕获的群体是不同的。

所以,不,他们不等同。

答案 1 :(得分:1)

这取决于你从中得到2个正则表达式的上下文。

如果您在现实生活正则表达式引擎的语法中解释这两个正则表达式,它们具有不同的含义,如Ed Cottrell explained in his answer+表示重复一次或多次。 |表示更改。

但是,如果您将+中的(a+b)*解释为替换,遵循大多数关于自动机理论的书中的符号,并{{{ 1}}在|中作为交替,遵循大多数现实生活中的正则表达式引擎中的符号。