3

我需要找到一个描述语言的正则表达式{w in {a,b,c}* | neither bc nor cb is part of w}

我是这样想的:因为 bc 和 cb 都不能成为正则表达式的一部分,所以任何 b 序列后跟 c 序列(反之亦然)都需要在 c 序列之前至少有一个“a”。这是我提供以下解决方案的方式:

(a+b)* | (a+c)* | (a+b)*a(a+c)* | ((a+b)*a(a+c)*a)* | (a+c)*a(a+b)* | ((a+c)*a(a+b)*a)*

我不确定我的解决方案的正确性,因此我想在这里询问它是否有效。除此之外,是否有一种数学方法可以找到相应的正则表达式?因为我的解决方案仅基于直觉。

先感谢您。

4

2 回答 2

4

我认为这可以简化。

你可以有as,或者bs 后面跟着aorb或 nothing,或者cs 后面跟着aor or cor nothing:

^(a|b([ab]|$)|(c[ac]|$))*$

使用前瞻断言,它更容易:

^(a|b(?!c)|c(?!b))*$
于 2013-11-10T21:41:26.053 回答
2

我们可以有以下内容:

a 前面有任何东西,
b 前面有 not c,
c 前面有 not b

这转化为:

regex = "^(?:a|(?<!c)b|(?<!b)c)*$"

^说“开始于”
a处理“a 后跟 b 或 c 或什么都没有,因为递归将处理 a 之后的内容”
(?<!c)说“b 后面没有 c”
(?<!b)说“c 后面但不前面有 b”
*说 0 或更多前面的表达式
$说“以”结尾

要了解这是如何工作的,让我们考虑"cb". “第一次迭代”匹配第三项,我们只得到一个“c”。所以,我们有一个'b'左边。进入b第二个学期,但由于负面的后视失败,我们不匹配。

编辑
回想起来,我可能应该使用前瞻而不是后瞻,但两种方法都是正确的,了解解决问题的多种方法对您有好处。

于 2013-11-10T21:46:48.547 回答