我需要找到一个描述语言{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)*
我不确定我的解决方案的正确性,因此我想在这里询问它是否有效。除此之外,是否有找到相应正则表达式的数学方法?因为我的解决方案仅基于直觉。
提前谢谢。
答案 0 :(得分:4)
我认为这可以简化。
您可以拥有a
或b
后跟a
或b
或任何内容,或c
s后跟的a
或c
或任何内容:
^(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
进入第二个任期,但由于负面的后视失败而且我们不匹配。
编辑:
回想起来,我可能应该使用前瞻而不是外观,但两种方式都是正确的,并且了解解决问题的多种方法对你有好处。