简化这个正则表达式

时间:2011-02-10 01:49:57

标签: regex simplify

我正在为我的编译器类做一些预考试练习,需要简化这个正则表达式。

(a U b)*(a U e)b* U (a U b)*(b U e)a*

很明显,e是空字符串,U代表联合。

到目前为止,我认为其中一个(a U b)*可以删除,因为U a = a的并集。但是,我找不到任何其他简化,到目前为止其他问题做得不好。 :(

非常感谢任何帮助!

4 个答案:

答案 0 :(得分:3)

首先翻译成该语言的英文描述:

(a U b)*(a U e)b* U (a U b)*(b U e)a*

转换为:


ab s的任意序列,后跟可选的a,后跟任意数量的b

OR

任意数量的ab,然后是可选的b,随后是任意数量的a


此处有很多重叠 - 至少(a U b)*(a U e)(a U b)*完全相同,因为“a s和b s的任意序列”必然a或epsilon结尾(因为任何字符串都可以以epsilon结尾)所以这些组可以被删除,留下

(a U b)*b* U (a U b)*a*

转换为:


ab s的任意序列,后跟任意数量的b s。

OR

任意数量的ab s,以及任意数量的a s


现在,最外层组的第一部分是相同的,所以让我们将它们合并为一个

(a U b)*(a* U b*)

转换为:


ab s的任意序列,后跟任意数量的a个OR,任意数字b s。


现在等一下,“As和Bs的任何序列”必然以“a s的任意序列或b s的任何序列”结束,意味着匹配第一部分的任何东西都可以匹配整个正则表达式(因为第二部分的长度可以为零)所以我们为什么不这样做呢

(a U b)*
塔达。简单。

答案 1 :(得分:1)

我认为整件事情等同于(a U b)*(或大多数正则表达式语法,(a|b)*

答案 2 :(得分:1)

正则表达式上有点生锈,但如果*仍然表示“零次或多次出现”,则可以替换:

(a U e)b* for (a U b)*

将第一部分留下:

(a U b)*(a U b)* = (a U b)*

在右侧,你有那个

(b U e)a* = (b U a)*

现在,由于U b = b U a,你得到:

(a U b)*(a U b)*

在右侧,只留下

(a U b)* U (a U b)* = (a U b)*

我认为就是这样......

答案 3 :(得分:0)

我会告诉你如何解决它:(不是很正式,也不保证)

看看主U的左侧:

(a U b)* - 这是什么意思?长度为n的a和b的组合,其中n> = 0。

接下来(美国)。我们有什么在这里?一个或一个空字。如果我们想要的话,我们可以在上一部分中得到它。如果我们想要e,那么无论如何我们都可以把它留下来。请注意,我们不必采取a,因为我们可以选择e。所以我们可以跳过整个部分。

下一步是什么? B *。那是什么?和我们想要的一样多。我们本来可以在第一部分得到那些!我们可以把它留下来!

所以左边唯一的东西是(a U b)*。

让我们看看右侧:

好的,现在很容易,我们可以使用相同的想法,它只是不同的字母。

我们也会以同样的方式得到(a U b)*。

所以最后我们有(a U b)* U(a U b)*你知道它等于(a U b)*。