语言的正则表达式

时间:2013-11-10 21:27:57

标签: regex

我需要找到一个描述语言{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)*

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

提前谢谢。

2 个答案:

答案 0 :(得分:4)

我认为这可以简化。

您可以拥有ab后跟ab或任何内容,或c s后跟的ac或任何内容:

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

使用lookahead assertions,更容易:

^(a|b(?!c)|c(?!b))*$

答案 1 :(得分:2)

我们可以拥有以下内容:

  

a前面有任何内容,
b前面没有c,
c前面没有b

这转换为:

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

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

要了解其工作原理,请考虑"cb"。 “第一次迭代”与第三项匹配,我们只得到一个'c'。所以,我们还剩下'b'b进入第二个任期,但由于负面的后视失败而且我们不匹配。

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