[英]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.