2

我需要编写一个正则表达式,它可以检测一个只包含字符 x、y 和 z 的字符串,但是这些字符与它们的邻居不同。

这是一个例子

xyzxzyz = 通过

xyxyxyx = 通过

xxyzxz = 失败(重复 x)

zzzxxzz = 失败(相邻字符重复)

我认为这会起作用 ((x|y|z)?)*,但它似乎不起作用。有什么建议么?

编辑

请注意,我正在寻找一个不允许向前看或向后看操作的答案。唯一允许的操作是交替、连接、分组和闭包

4

4 回答 4

13
于 2012-12-03T04:25:22.513 回答
3

这应该做你想要的:

^(?!.*(.)\1)[xyz]*$

(显然,仅在具有前瞻功能的引擎上)

内容本身由第二部分处理:([xyz]*任意数量的 x、y 或 z 字符)。锚^...$在这里是说它必须是整个字符串。并且特殊条件(没有相邻对)由否定前瞻处理(?!.*(.)\1),这表示字符串中的任何位置都不能有一个字符后跟相同的字符。

于 2012-12-03T02:40:01.177 回答
1

我今天走路时有一个想法并将其放在正则表达式上,但我还没有找到它不正确匹配的模式。所以这里是正则表达式:

^((y|z)|((yz)*y?|(zy)*z?))?(xy|xz|(xyz(yz|yx|yxz)*y?)|(xzy(zy|zx|zxy)*z?))*x?$

这是一个小提琴

如果您发现模式不匹配,请告诉我,我会尝试修改它!我知道这有点晚了,但我真的很困扰我无法解决它。

于 2012-12-03T03:18:38.007 回答
0

I understand this is quite an old question and has an approved solution as well. But then I am posting 1 more possible and quick solution for the same case, where you want to check your regular expression that contains consecutive characters.

Use below regular expression:

String regex = "\\b\\w*(\\w)\\1\\1\\w*";

Listing possible cases that above expression returning the result.

Case 1: abcdddd or 123444

Result: Matched

Case 2: abcd or 1234

Result: Unmatched

Case 3: &*%$$$ (Special characters)

Result: Unmatched

Hope this will be helpful... Thanks:)

于 2021-04-12T12:05:48.000 回答