Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在正则表达式中顺序不重要吗?_Regex_Computer Science_Regular Language_Automata - Fatal编程技术网

Regex 在正则表达式中顺序不重要吗?

Regex 在正则表达式中顺序不重要吗?,regex,computer-science,regular-language,automata,Regex,Computer Science,Regular Language,Automata,我在看stackoverflow链接()中提出的问题,它被要求为aover的奇数∑={a,b}的字符串找到正则表达式 最重要的评论给出的答案是b*(ab*ab*)*ab* 我很困惑-a就放在最后一个b*之前,这个顺序真的重要吗?为什么不能改为b*a(ab*ab*)*b*(其中a放在第一个b*之后),或者它的任何其他排列 另一件我感到困惑的事情是为什么它是(ab*ab*)*,而不是(b*ab*ab*)*。b*ab*ab*对“恰好有2个a”的定义是否更准确 为什么不能改为b*a(ab*ab*)*b*

我在看stackoverflow链接()中提出的问题,它被要求为
a
over
的奇数∑={a,b}
的字符串找到正则表达式

最重要的评论给出的答案是
b*(ab*ab*)*ab*

我很困惑-
a
就放在最后一个
b*
之前,这个顺序真的重要吗?为什么不能改为
b*a(ab*ab*)*b*
(其中
a
放在第一个
b*
之后),或者它的任何其他排列

另一件我感到困惑的事情是为什么它是
(ab*ab*)*
,而不是
(b*ab*ab*)*
b*ab*ab*
对“恰好有2个
a
”的定义是否更准确

为什么不能改为
b*a(ab*ab*)*b*

b*a(ab*ab*)*b*
不起作用,因为它要求字符串在第一个非前导
b
之前有两个连续的
a
s,不是吗?例如,
abaa
将不会与您建议的正则表达式匹配,而它应该匹配。在像这样的站点上使用regex调试器可以自己查看这一点

另一方面,将整个
ab*
部分移动到起点(
b*ab*(ab*ab*)*
)也可以工作

为什么它是
(ab*ab*)*
,而不是
(b*ab*ab*)*


(b*ab*ab*)*
确实有效,但第一个
b*
是非常多余的,因为剩下的
b
将由组中最后一个
b*
匹配。组前面还有一个
b*
,这导致
b*
无法匹配任何内容,因此它是多余的。

有无限多个等价的正则表达式,它们生成给定(无限)的正则语言。在某些情况下,某些作者可能更倾向于使用特定的表达式:人们可能更倾向于使用最小表达式,或者使用显示结构或对称性的表达式,甚至可以使用归纳法简化推理

您移动a的特别建议是不够的,因为如上所述,这样可以确保子字符串aa将出现在具有多个a的任何字符串中。然而,可以将abab改为baba,以使安置工作顺利进行。选择babab*将与任一位置一起工作。您甚至可以选择像bab+bababab+(babab*)a(babab*)这样的表达式,根据您的应用程序,它可能很好地使用。像b*(abab)ab*这样的东西有最小化的优点(如果它不是严格最小的,那么它一定非常接近)