2

我有一个正则表达式来检查字母的有限重复以及两个单独的正则表达式中的数字,但我试图结合一个正则表达式,但它总是返回 true。

// Alphabetes testing:
/([a-z])\1{4,}/.test("sd0") => false
/([a-z])\1{4,}/.test("adsssssd0") => true
// Numeric testing:
/([0-9])\1{3,}/.test("sd00000ds") => true
/([0-9])\1{3,}/.test("sd00s00ds") => false
/(([a-z])\1{4,})|(([0-9])\1{3,})/.test("sd0sds0sds") => true // always true

谢谢。

4

4 回答 4

2

只需使用

([a-z0-9])\1{3,}

在 Regexr 上查看

您表达的问题是捕获组的编号。它们按左括号的顺序编号

(([a-z])\1{3,})|(([0-9])\1{3,})
12              34

因此,通过您的反向引用,您总是在引用(([a-z])\1{3,}). 如果您在组本身(递归)中引用组,我不确定会发生什么。看起来它匹配每个字符(Regexr

更新:

如果有不同的长度要求,那么您需要使用替代,但您需要在替代中引用不同的组!

(?:([a-z])\1{4,}|([0-9])\2{3,})

(?:是一个非捕获组 ==> 它不计入反向引用

在 Regexr 上查看

于 2013-02-21T07:31:38.543 回答
1

下面的正则表达式呢?

([a-z0-9])\1{3,}

如果连续重复 3 个或更多数字/字母时您需要匹配,那将起作用。

于 2013-02-21T07:29:54.347 回答
1

您正在检查字母或数字字符集。由于中间和末尾的sd0sds0sds返回。truesds

如果您希望字符串匹配两个条件 - 应该有一个三个字符的字母集和一个三个字符的数字集,我认为这不能使用单个正则表达式来完成。

如果您希望字符串允许由字母或数字组成的三个字符集,那么其他答案是合适的(没有反向引用):

[a-z0-9]{3}
于 2013-02-21T07:30:54.660 回答
1

您的最后一个正则表达式有一个错误:

(([a-z])\1{4,})|(([0-9])\1{3,})

两次使用 \1 引用,但 \1 指的是括号中的第一个块,实际上是

([a-z])\1{4,})|(([0-9])\1{3,}

当您更正参考编号时,您的正则表达式实际上有效

(([a-z])\2{4,})|(([0-9])\4{3,})

在行动中看到它:http ://regexr.com?33rnk

于 2013-02-21T08:20:55.303 回答