Regex (a&x2B;b)*和(a*b*)*之间有什么区别?

Regex (a&x2B;b)*和(a*b*)*之间有什么区别?,regex,computer-science,automata,Regex,Computer Science,Automata,我假设∑={a,b}。 我想找出表示∑的RE* (∑*表示字母表上所有可能字符串的集合∑) 我得出了以下两个结果(正则表达式) 然而,我不能自己决定哪个RE是正确的,或者两者都是不好的。 所以,请告诉我正确的答案 在正规正则表达式语法中,(a+b)*表示以a开头,然后有零个或多个a,然后是ab的任何序列中的零个或多个。这会打折像baa(它不是以a开头)、abba和a(每个a组后面必须有一个b),因此是不正确的 (a*b*)*表示包含零个或多个a后跟零个或多个b的任何序列中的零个或多个。这更正确,

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

我得出了以下两个结果(正则表达式)

然而,我不能自己决定哪个RE是正确的,或者两者都是不好的。
所以,请告诉我正确的答案

在正规正则表达式语法中,
(a+b)*
表示以
a
开头,然后有零个或多个
a
,然后是a
b
的任何序列中的零个或多个。这会打折像
baa
(它不是以
a
开头)、
abba
a
(每个
a
组后面必须有一个
b
),因此是不正确的

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

<>但是,选择更简单的<代码> [ab] *<代码>(或<代码> [ab] +<代码>在不太可能的事件中考虑空字符串无效)。这基本上是从类
[ab]
中提取的任何字符的零(一个用于
+
变量)或更多


但是,由于您使用的是
,因此您可能讨论的是形式语言理论(其中
很常见),而不是正则表达式语法(通常不是)

如果是这种情况,那么您应该理解,形式语言中有一些变体,其中
a | b
表达式(实际上是正则表达式语法中的
[ab]
)可以作为
a中的一个来呈现∪ b
a∨ b
a+b
,其中每个运算符符号表示“逻辑或”

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


此外,您的
(a*b*)*
选项也涵盖了这一点,但最好选择最简单的一个:-)

在学术正则表达式中,
+
运算符通常用于表示联合(
,“或”),而不是在非学术设置中通常表示的“一个或多个”(如大多数正则表达式实现)

因此,
a+b
表示
[ab]
a | b
,因此
(a+b)*
表示长度为0或以上的任何字符串,包含任意数量的
a
s和
b
s

同样地,
(a*b*)*
也指长度为0或以上的任何字符串,包含任何顺序的
a
s和
b
s的任何数量


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

后者是正确的。前者要求每个
b
之前至少有一个
a
,因此字符串
b
不匹配。例如,如果这是在计算机科学-形式语言和自动机-忽略paxdiablo的答案和我们相反,e Welbog的描述“汽车”和“汽车动力移动装置”(汽车和希腊语的“aftokinito”)也可以指同一个词,但我认为我更喜欢前者。我并不反对你的答案,只是建议你更喜欢
(a+b)*
,而不是另一个:-)
(a+b)*
(a*b*)*