我正在编写一个评估正则表达式的程序。
Does (a|b)* = (a*|b*)?
当我评估正则表达式时,如果这是真的那么它会帮我评估一个更简单的正则表达式。
答案 0 :(得分:2)
这些不是等效的正则表达式。考虑字符串“aaaaab”。它将使用第一个正则表达式定义的语言,而不是第二个正则表达式。
原因是(a | b)*可以重复子正则表达式,(a | b),零次或多次,而(a * | b *)只能重复一次。
为了使它更清晰,第二种语言由仅包含一个或仅包含b(或没有)的字符串组成,但不包含包含a和b的字符串。
这是因为Kleene星运算符()代表“左边的项目零或更多”。在前一个正则表达式的情况下,左边的项是包含括号的表达式。在后者中,左边的项目是“a”和“b”。但是,| (或)运算符意味着您可以选择或b *,但不能同时选择两者。
如果我们想全力以赴,第二个正则表达式定义的语言实际上是第一个正则表达式定义的语言的一个子集。
随意询问您是否需要更多细节。