3

我正在尝试制作一个可以验证输入字符串的模式。验证规则不允许任何字符连续重复超过 3 次。

例如:

Aabcddee- 已验证。

Aabcddde-无效,因为 3 d字符。

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

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

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

谢谢。

4

2 回答 2

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标志,所以捕获的文本不会进行不区分大小写的匹配。

于 2013-01-17T09:39:23.837 回答
1

从你的问题我知道你想匹配

  • [A-Za-z]仅由AND中的字符组成的字符串
  • 仅包含不包含长度为 3 或更多的相同字符序列的字符串

那么这个正则表达式应该可以工作:

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

perl 中的示例

于 2013-01-17T11:17:00.140 回答