繁体   English   中英

简化这个正则表达式

[英]Simplify this regular expression

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

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

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

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

感谢任何帮助,非常感谢!

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

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

翻译为:


的任何序列a S或b S,接着任选的a ,随后的任何数量的b秒。

要么

任何数量的a S和b S,接着任选的b ,通过任何数量的follwed a小号


有很多重叠这里的-至少(a U b)*(a U e)是完全一样的(a U b)* ,因为“的任何序列a S和b的” 一定要么被结束a或epsilon(因为任何字符串都可以以epsilon结尾)所以这些组可以被删除,留下

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

翻译为:


的任何序列a S或b秒,然后通过任何数目的b秒。

要么

任何数量的a S和b S,通过任何数量的follwed a小号


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

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

翻译为:


的任何序列a S或b秒,然后通过任何数量的a S或通过任何数量b秒。


现在请稍等“ As和Bs的任何序列” 必然与“的任何序列结束a S或的任何序列b的”,这意味着其中第一部分可以匹配整个正则表达式(因为第二部分可以匹配任何长度为零)所以我们为什么不做它

(a U b)*

塔达 简单。

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

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

(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)*

我想就是这样......

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

看看主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)*。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM