正则表达式匹配不包含'xxx'的字符串

ubi*_*con 3 regex

我的一个家庭作业问题要求为所有字符串开发一个正则表达式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)

Kob*_*obi 5

试试这个:

^(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)