2013-02-21 138 views
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 

谢谢。

+0

为什么就不能'/([AZ] {3})|([0 -9] {3,...})/'?不知道为什么你需要回去参考。 – dfsq 2013-02-21 07:25:54

+0

也许这是因为我的英语,但我不明白你想做什么':(' – 2013-02-21 07:27:12

+0

我只希望只有当同一个字符重复超过3次才能返回true。 – Garfield 2013-02-21 07:27:18

回答

2

只需使用

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

看到它here on Regexr

你的表达的问题是捕获组的编号。他们在开括号的顺序编号

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

所以,用你的背参考你总是refereing到(([a-z])\1{3,})。我不确定会发生什么,如果你引用组内的一个组(递归)。它看起来像它的每一个字符(Regexr

匹配

更新:

如果有不同的长度要求,那么你需要使用的交替,但你需要涉及到不同群体的替代品!

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

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

看到它here on Regexr

+0

因此,我应该使用两个正则表达式,并且没有其他选项用于我的场景。 – Garfield 2013-02-21 08:06:29

+0

我们无法看到您的问题,字母和数字有不同的长度要求! – stema 2013-02-21 08:10:09

+0

糟糕!我的mi股权@stema – Garfield 2013-02-21 08:12:51

1

那么下面的正则表达式呢?

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

如果你需要的是比赛,只要3个或多个数字/字母连续重复,将工作。

1

您正在检查是否有字母或数字字符集。 sd0sds0sds返回true,因为中间和最后是sds

如果你想让字符串匹配BOTH条件 - 应该有一个三个字符的字母集和一个三个字符的数字集,我不认为这可以用一个正则表达式来完成。

如果你希望字符串允许一个三字符集无论是字母或数字,然后其他的答案是适当的(不反向引用):

[a-z0-9]{3} 
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