正则表达式中的顺序无关紧要吗?

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* 的优点是最小(如果不是严格最小,它必须非常接近)。