繁体   English   中英

是否可以进一步简化此正则表达式?

[英]Is it possible to simplify this regular expression any further?

我正在为我的编译器类做一些家庭作业,但遇到以下问题:

为所有包含奇数个a或奇数个b或所有bab的字符串编写一个正则表达式。

经过大量的白板工作,我想出了以下解决方案:

(aa|bb)* (ab|ba|a|b) ((aa|bb)* (ab|ba) (aa|bb)* (ab|ba) (aa|bb)*)*

但是,这是我能得到的最简化的吗? 我已经考虑过构建DFA,尝试最小化那里的州数,看看这是否对我有所帮助,但我认为我首先要问一下正则表达式专家。

遵循格雷格D的建议,即从a(aa)*开始,然后从那里开始。 Sepp2k几乎正确,但真正的考虑是您不必在意另一个字母。 我的意思是,当您查看“ a的奇数”约束时,您根本不在乎字符串中b的含义。 因此,将b *粘贴在您可以使用的任何位置:)

Sepp2k的答案几乎是正确的,但这是正确的:

b* a b* (a b* a b* )* | a* b a* (b a* b a* )*

详细说来,此正则表达式计算出所有带有奇数a的字符串(第一部分),或将那些字符串与任何包含奇数b的字符串进行或运算。

这应该工作:

b* a b* (a b* a b*)* |  a* b a* (b a* b a*)*

恐怕我不相信您写的正则表达式是正确的。 考虑以下字符串:

aba

我们有几种比赛选择,但事实是它的长度是奇数,这意味着我们必须在前面匹配一个孤独的a,因此:

(a)(ba)

但是,可悲的是,您的第二个主要分组不可能匹配(ba)。

当处理这样的约束时,我发现从核心约束开始并从那里开始更容易。 在这种情况下,您的约束是“奇数”,因此从

a(aa)*

强制奇数的a的从那里走。 :)

我认为您需要以不同的方式处理问题。

您正在尝试匹配ab都没有偶数的任何内容。

从匹配偶数 ab东西开始可能会更容易。 此时您要做的就是在末尾添加与您实际要匹配的最小字符串匹配的内容。

暂无
暂无

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

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