编译器- DFA (a+b)* vs (a|b)* 两者之间有什么区别?
Compiler- DFA (a+b)* vs (a|b)* any difference between both?
(a+b)* 和 (a|B)* 会产生相同的 DFA 和相同的输出吗?
在数学中,只要涉及 'or' 这个词,我们就会使用加法运算符。
那么这是否意味着两个表达式是等价的?
没有
(a+b)*
匹配至少一个 a
后跟一个 b
,零次或多次。因此,要匹配非空字符串,该字符串必须在某个时刻包含 ab
.
(a|B)*
需要 a
或 b
,零次或多次。可以匹配空串、全a
的串、全b
的串等
第二个表达式匹配以下示例中的整个字符串:a
、aa
、aaa
、b
、bb
、bbb
, 等。第一个表达式在技术上匹配(因为零长度字符串会匹配),但不匹配整个字符串。捕获的组不同。
所以,不,它们不等价。
这取决于您从中获取 2 个正则表达式的上下文。
如果您在现实生活中的正则表达式引擎的语法中解释这两个正则表达式,它们具有不同的含义,如 。 +
表示重复一次或多次。 |
表示交替。
但是,如果您将 (a+b)*
中的 +
解释为 alternation,则它们可以表示完全相同的意思,遵循大多数关于自动机的书籍中的符号理论上,(a|b)*
中的 |
作为 交替 ,遵循大多数现实生活中的正则表达式引擎中的符号。
(a|b)*
表示{ε, "a", "b", "aa", "ab", "ba", "bb", "aaa ", 父亲,父亲,父亲,母亲...}
(a+b)*
表示 {ε, ab, aab, aab, aab, aab,...}
ε
表示为空
(a+b)* 和 (a|B)* 会产生相同的 DFA 和相同的输出吗? 在数学中,只要涉及 'or' 这个词,我们就会使用加法运算符。 那么这是否意味着两个表达式是等价的?
没有
(a+b)*
匹配至少一个 a
后跟一个 b
,零次或多次。因此,要匹配非空字符串,该字符串必须在某个时刻包含 ab
.
(a|B)*
需要 a
或 b
,零次或多次。可以匹配空串、全a
的串、全b
的串等
第二个表达式匹配以下示例中的整个字符串:a
、aa
、aaa
、b
、bb
、bbb
, 等。第一个表达式在技术上匹配(因为零长度字符串会匹配),但不匹配整个字符串。捕获的组不同。
所以,不,它们不等价。
这取决于您从中获取 2 个正则表达式的上下文。
如果您在现实生活中的正则表达式引擎的语法中解释这两个正则表达式,它们具有不同的含义,如 +
表示重复一次或多次。 |
表示交替。
但是,如果您将 (a+b)*
中的 +
解释为 alternation,则它们可以表示完全相同的意思,遵循大多数关于自动机的书籍中的符号理论上,(a|b)*
中的 |
作为 交替 ,遵循大多数现实生活中的正则表达式引擎中的符号。
(a|b)*
表示{ε, "a", "b", "aa", "ab", "ba", "bb", "aaa ", 父亲,父亲,父亲,母亲...}
(a+b)*
表示 {ε, ab, aab, aab, aab, aab,...}
ε
表示为空