我正在尝试创建一个单一模式来验证输入字符串。验证规则不允许任何字符连续重复超过 3 次。
例如:
Aabcddee
- 有效。
Aabcddde
- 无效,因为有 3 个 d 字符。
目标是提供一个可以匹配上述示例之一但不能同时匹配两者的 RegExp 模式。我知道我可以使用反向引用,例如 ([a-z])\1{1,2}
但这只匹配顺序字符。我的问题是我无法弄清楚如何为此制作单一图案。我试过了,但我不太明白为什么它不起作用:
^(([a-z])\1{1,2})+$
在这里,我尝试匹配在内部组中重复 1 次或 2 次的任何字符,如果重复多次,则匹配该内部组。但它不是那样工作的。
谢谢。
最佳答案
要检查字符串中没有连续重复 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
标志,因此捕获的文本不会进行不区分大小写的匹配。
关于正则表达式 : How to match a string that doesn't have any character repeated 3 times?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14375402/