正则表达式 : How to match a string that doesn't have any character repeated 3 times?

标签 regex pcre backreference

我正在尝试创建一个单一模式来验证输入字符串。验证规则不允许任何字符连续重复超过 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/

相关文章:

regex - 使用正则表达式提取 `<key>=<value>` 对,点组 (.+?) 不与可选空格 (\s) 合作

php - 使用 preg_match 拆分邮件 header

regex - 提高 PCRE 正则表达式模式的性能

java - 正则表达式;反向引用字符集中不匹配的字符

python - 无法让 Python 正则表达式反向引用发挥作用

javascript - 通过正则表达式将单引号更改为双引号。 (单字)

php - lua 正则表达式,用于将关键字与从 PHP 中采用的值匹配

Javascript RegEx 匹配没有前后连字符的单词

php - 用 preg_replace 包裹 <b> 标签中的第一个单词——不能引用全字符串匹配

javascript - 密码验证正则表达式 : require and forbid certain characters