我假设Σ= {a,b}。 我想找出表示Σ*的RE (Σ*表示字母Σ上所有可能的字符串的集合)
我想出以下两个RE(正则表达式)
(a+b)*
(a*b*)*
但是,我无法自行确定哪个RE正确或两者都不好。 所以,请告诉我正确答案。
答案 0 :(得分:4)
在正则表达式语法中,(a+b)*
表示以a
开头的任何序列中的零个或多个,然后是零个或多个a
,然后是b
。这样会打折baa
(不是以a
开头),abba
和a
(必须确切地是一个 {{每个b
组之后的1}},因此不正确。
a
表示包含零个或多个(a*b*)*
后跟零个或多个a
的任何序列中的零个或多个。这是更正确的,因为它允许起始字符,任何顺序和数量的字符等等。它还允许b
应该允许的空字符串(但我会留给您)。
但是,最好选择简单得多的Σ*
(或者在极少数情况下您认为空字符串无效的情况下选择[ab]*
)。从类[ab]+
提取的任何字符基本上都为零(+
变体为一个)或更多。
但是,由于您使用的是[ab]
,因此可能,您可能正在讨论正规语言理论(其中Σ
很常见),而不是regex语法(通常不是这样)。
如果是 情况,那么您应该了解,形式语言有一些变体,可以代替Σ
表达式(在正则表达式语法中有效地为a | b
)作为[ab]
,a ∪ b
或a ∨ 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。
这两种表达方式是表达相同语言的不同方式。