(a + b)*和(a * b *)*有什么区别?

时间:2020-02-07 04:10:45

标签: regex computer-science automata

我假设Σ= {a,b}。 我想找出表示Σ*的RE (Σ*表示字母Σ上所有可能的字符串的集合)

我想出以下两个RE(正则表达式)

(a+b)*
(a*b*)*

但是,我无法自行确定哪个RE正确或两者都不好。 所以,请告诉我正确答案。

2 个答案:

答案 0 :(得分:4)

在正则表达式语法中,(a+b)*表示以a开头的任何序列中的零个或多个,然后是零个或多个a,然后是b。这样会打折baa(不是以a开头),abbaa(必须确切地是一个 {{每个b组之后的1}},因此不正确。

a表示包含零个或多个(a*b*)*后跟零个或多个a的任何序列中的零个或多个。这是更正确的,因为它允许起始字符,任何顺序和数量的字符等等。它还允许b应该允许的空字符串(但我会留给您)。

但是,最好选择简单得多的Σ*(或者在极少数情况下您认为空字符串无效的情况下选择[ab]*)。从类[ab]+提取的任何字符基本上都为零(+变体为一个)或更多。


但是,由于您使用的是[ab],因此可能,您可能正在讨论正规语言理论(其中Σ很常见),而不是regex语法(通常不是这样)。

如果是 情况,那么您应该了解,形式语言有一些变体,可以代替Σ表达式(在正则表达式语法中有效地为a | b)作为[ab]a ∪ ba ∨ b中的一个,其中每个运算符都代表“逻辑或”。

这将意味着a + b实际上是正确的(因为它相当于我上面给出的正则表达式语法),因为它基本上表示集合(a+b)*中的任何字符,重复零或更多次。

此外,您的{a, b}选项还涵盖了 ,但是选择最简单的方法通常总会更好:-)

答案 1 :(得分:3)

+运算符通常用于在学术正则表达式中表示并集(|,“或”),而不是通常在非学术环境中表示的“一个或多个”(例如大多数正则表达式的实现)。

因此,a+b表示[ab]a|b,因此(a+b)*表示长度为0或更大的任何字符串,包含任意数量的a和{ {1}}任意顺序。

同样,b也表示长度为0或更大的任何字符串,包含任意顺序的任意数量的(a*b*)*a s。

这两种表达方式是表达相同语言的不同方式。