我的一个家庭作业问题要求为所有字符串开发一个正则表达式x,y,z而不包含xxx
在做了一些阅读之后,我发现了一个负面的前瞻,并使这个很有效:
(x(?!xx)|y|z)*
尽管如此,本着完整的精神,无论如何都要写下这个没有负面前瞻的东西吗?
阅读我已经完成了让我觉得它可以用一些组合来完成carets (^),但我无法得到正确的组合,所以我不确定.
更进一步,是否可以排除像xxx只使用or (|)运算符的字符串,但仍然以递归的方式检查字符串?
编辑9/6/2010:
我想我回答了自己的问题.我更多地搞砸了这个,尝试用正则表达这个正则表达式,or (|)我很确定我想出来......它并不像我想象的那样混乱.如果其他人有时间用肉眼验证这一点我会很感激.
(xxy|xxz|xy|xz|y|z)*(xxy|xxz|xx|xy|xz|x|y|z)
试试这个:
^(x{0,2}(y|z|$))*$
Run Code Online (Sandbox Code Playgroud)
基本思路是:匹配最多2个X,然后是另一个字母或字符串的结尾.
当你到达有3个X的点时,正则表达式没有允许它保持匹配的规则,并且它失败了.
工作示例:http://rubular.com/r/ePH0fHlZxL
写一个不太紧凑的方法是(有空格,通常是/x标志):
^(
y| # y is ok
z| # so is z
x(y|z|$)| # a single x, not followed by x
xx(y|z|$) # 2 x's, not followed by x
)*$
Run Code Online (Sandbox Code Playgroud)
基于最新的编辑,这里是一个更平坦的模式版本:我不完全确定我理解你对管道的迷恋,但你可以消除一些更多的选择 - 通过允许第二组的空匹配你不需要重复第一组的排列.那个正则表达式也允许ε,我认为它包含在你的语言中.
^(xxy|xxz|xy|xz|y|z)*(xx|x|)$
Run Code Online (Sandbox Code Playgroud)