您好我正在寻找使用三个字符x,y,z的正则表达式,彼此相邻的两个字符之间没有相同的字符。 例如: xyx通过 xyzyzx通过 xyxxzy失败(彼此相邻的两个x) xyxzxy通过 我试过“x(yz | yx)* | y(xz | xy)* | z(yz | yx)*”,但这显然不正确,因为它不包括像xy或xyzxy这样的字符串。请帮帮我
答案 0 :(得分:1)
您可以使用否定前瞻来执行此操作。
^(x(?!x)|y(?!y)|z(?!z))*$
编辑:这是一般情况:
^(?:(.)(?!\1))*$
编辑2:
^(x(?:[^x]|$)|y(?:[^y]|$)|z(?:[^z]|$))*$
但是说真的,做自己的功课。你通过复制和粘贴我的工作来学习绝对没有。
答案 1 :(得分:0)
由于这似乎是一个功课,我不会透露完整的答案,但我会使用基本的正则表达式(连接,Kleene星和替代品)给你完整的解释
这个想法是将语言分为三个部分:
x
y
z
这些情况彼此类似,所以我只会解释其中一个,比如第一个,那些以x
开头的字符串。
首先请注意,该语言只应在y
的两次出现之间包含z
和x
。现在我们正在考虑以x
开头的字符串,因此在下一个y
之前必须只有z
和x
。因此,假设P
是一个匹配“交替y
和z
长度至少为1”的正则表达式,我们有以下正则表达式来匹配这种情况:
x(Px)*P?
因为它会以x
开头,然后是x
的任意数量的重复,每个重复前面都有y
和z
的任意序列,然后它可以选择以另一个交替的y
和z
序列结束,以满足所有可能的结局(x
,y
和z
)
那么P
是什么?不出所料,这也与我们刚刚构建的结构类似,因为之前的正则表达式描述了“x
和P
的长度至少为1 x
”。因此,将x
更改为y
和P
更改为z
,并考虑以y
和z
开头的序列,我们{ {1}}等于:
P
因此,您可以将y(zy)*z?|z(yz)*y?
替换为{1}}以获取案例1的完整正则表达式。
我们可以对案例2和案例3做同样的事情,你将得到完整的答案。
请注意,按照此方法,您可以将结果扩展为四个变量,依此类推。