正则表达式没有相同的字符彼此相邻

时间:2014-03-21 03:50:17

标签: regex

您好我正在寻找使用三个字符x,y,z的正则表达式,彼此相邻的两个字符之间没有相同的字符。 例如: xyx通过 xyzyzx通过 xyxxzy失败(彼此相邻的两个x) xyxzxy通过 我试过“x(yz | yx)* | y(xz | xy)* | z(yz | yx)*”,但这显然不正确,因为它不包括像xy或xyzxy这样的字符串。请帮帮我

2 个答案:

答案 0 :(得分:1)

您可以使用否定前瞻来执行此操作。

^(x(?!x)|y(?!y)|z(?!z))*$

编辑:这是一般情况:

^(?:(.)(?!\1))*$

编辑2:

^(x(?:[^x]|$)|y(?:[^y]|$)|z(?:[^z]|$))*$

但是说真的,做自己的功课。你通过复制和粘贴我的工作来学习绝对没有

答案 1 :(得分:0)

由于这似乎是一个功课,我不会透露完整的答案,但我会使用基本的正则表达式(连接,Kleene星和替代品)给你完整的解释

这个想法是将语言分为三个部分:

  1. x
  2. 开头的人
  3. y
  4. 开头的人
  5. z
  6. 开头的人

    这些情况彼此类似,所以我只会解释其中一个,比如第一个,那些以x开头的字符串。

    首先请注意,该语言只应在y的两次出现之间包含zx。现在我们正在考虑以x开头的字符串,因此在下一个y之前必须只有zx。因此,假设P是一个匹配“交替yz长度至少为1”的正则表达式,我们有以下正则表达式来匹配这种情况:

    x(Px)*P?
    

    因为它会以x开头,然后是x的任意数量的重复,每个重复前面都有yz的任意序列,然后它可以选择以另一个交替的yz序列结束,以满足所有可能的结局(xyz

    那么P是什么?不出所料,这也与我们刚刚构建的结构类似,因为之前的正则表达式描述了“xP的长度至少为1 x”。因此,将x更改为yP更改为z,并考虑以yz开头的序列,我们{ {1}}等于:

    P

    因此,您可以将y(zy)*z?|z(yz)*y? 替换为{1}}以获取案例1的完整正则表达式。

    我们可以对案例2和案例3做同样的事情,你将得到完整的答案。

    请注意,按照此方法,您可以将结果扩展为四个变量,依此类推。