正则表达式:如何匹配没有任何字符重复3次的字符串?

时间:2013-01-17 09:03:08

标签: regex pcre backreference

我正在尝试创建一个验证输入字符串的模式。验证规则不允许任何字符连续重复3次。

例如:

Aabcddee - 有效。

Aabcddde - 有效,因为有3个 d 个字符。

目标是提供一个可以匹配上述示例之一的RegExp模式,但不能同时匹配两者。我知道我可以使用([a-z])\1{1,2}之类的反向引用,但这只匹配顺序字符。我的问题是我无法弄清楚如何为此制作单一模式。我试过这个,但我不明白为什么它不起作用:

^(([a-z])\1{1,2})+$

这里我尝试匹配在内部组中重复1或2次的任何字符,然后如果它重复多次,我匹配该内部组。但它不是这样的。

感谢。

2 个答案:

答案 0 :(得分:6)

检查字符串是否没有连续3次或更多次的字符(任何类型,甚至是新行):

/^(?!.*(.)\1{2})/s

您还可以检查输入字符串与此正则表达式是否匹配。在这种情况下,您还可以知道连续重复3次或更多次的字符。请注意,这与上面的完全相同,只是取消负前瞻(?!pattern)内的正则表达式。

/^.*(.)\1{2}/s

如果您要添加验证,该字符串仅包含[a-z]中的字符,并且您认为aaA无效:

/^(?!.*(.)\1{2})[a-z]+$/i

正如您所看到的,i标志(不区分大小写)会影响捕获的文本与当前输入的比较方式。

如果您想允许空字符串传递,请将+更改为*

如果您想将aaA视为有效,并且您想同时允许大写和小写:

/^(?!.*(.)\1{2})[A-Za-z]+$/

初看起来,它看起来可能与前一个相同,但由于没有i标志,所捕获的文本不会受到不区分大小写的匹配。

以下是失败的回答,你可以忽略它,但你可以阅读它以获得乐趣。


您可以使用此正则表达式来检查字符串是否没有3个重复字符(任何类型,甚至是新行)。

/^(?!.*(.)(?:.*\1){2})/s

您还可以检查输入字符串与此正则表达式是否匹配。在这种情况下,您还可以知道重复的字符大于或等于3次。请注意,这与上面的完全相同,只是取消负前瞻(?!pattern)内的正则表达式。

/^.*(.)(?:.*\1){2}/s

如果您要添加验证,该字符串仅包含[a-z]中的字符,并且您认为aaA无效:

/^(?!.*(.)(?:.*\1){2})[a-z]+$/i

正如您所看到的,i标志(不区分大小写)会影响捕获的文本与当前输入的比较方式。

如果您想将aaA视为有效,并且您想同时允许大写和小写:

/^(?!.*(.)(?:.*\1){2})[A-Za-z]+$/

初看起来,它看起来可能与前一个相同,但由于没有i标志,所捕获的文本不会受到不区分大小写的匹配。

答案 1 :(得分:1)

根据您的问题,我得到您想要匹配的内容

  • 仅包含来自[A-Za-z] AND
  • 的字符的字符串
  • 只有没有相同字符序列且长度为3或更多的字符串

然后这个正则表达式应该起作用:

^(?:([A-Za-z])(?:(?!\1)|\1(?!\1)))+$

Example in perl