正则表达式中的顺序无关紧要吗?
Does order not matter in regular expressions?
我正在查看此 Whosebug link () 中提出的问题,要求找到奇数个 a
的字符串的正则表达式Σ = {a,b}
。
置顶评论给出的答案是b*(ab*ab*)*ab*
。
我很困惑 - a
刚好放在最后一个 b*
之前,这个顺序真的重要吗?为什么不能改为 b*a(ab*ab*)*b*
(其中 a
放在第一个 b*
之后),或者它的任何其他排列?
另一件让我感到困惑的事情是为什么它是 (ab*ab*)*
而不是 (b*ab*ab*)*
。 b*ab*ab*
不是 'having exactly 2 a
' 更准确的定义吗?
Why can't it be b*a(ab*ab*)*b*
instead?
b*a(ab*ab*)*b*
不起作用,因为它要求字符串在第一个非前导 b
之前有两个连续的 a
,不是吗?例如,abaa
在应该匹配时不会与您建议的正则表达式匹配。在像 Regex101 这样的网站上使用正则表达式调试器亲自查看。
另一方面,将整个 ab*
部分移动到开头 (b*ab*(ab*ab*)*
) 也可以。
why it is (ab*ab*)*
and not (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* 的优点是最小(如果不是严格最小,它必须非常接近)。
我正在查看此 Whosebug link (a
的字符串的正则表达式Σ = {a,b}
。
置顶评论给出的答案是b*(ab*ab*)*ab*
。
我很困惑 - a
刚好放在最后一个 b*
之前,这个顺序真的重要吗?为什么不能改为 b*a(ab*ab*)*b*
(其中 a
放在第一个 b*
之后),或者它的任何其他排列?
另一件让我感到困惑的事情是为什么它是 (ab*ab*)*
而不是 (b*ab*ab*)*
。 b*ab*ab*
不是 'having exactly 2 a
' 更准确的定义吗?
Why can't it be
b*a(ab*ab*)*b*
instead?
b*a(ab*ab*)*b*
不起作用,因为它要求字符串在第一个非前导 b
之前有两个连续的 a
,不是吗?例如,abaa
在应该匹配时不会与您建议的正则表达式匹配。在像 Regex101 这样的网站上使用正则表达式调试器亲自查看。
另一方面,将整个 ab*
部分移动到开头 (b*ab*(ab*ab*)*
) 也可以。
why it is
(ab*ab*)*
and not(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* 的优点是最小(如果不是严格最小,它必须非常接近)。