分隔正则表达式和jQuery,防止重复字符

分隔正则表达式和jQuery,防止重复字符,jquery,regex,validation,Jquery,Regex,Validation,我已经阅读了很多关于防止重复字符的堆栈溢出的答案,但这些都是在正则表达式字符串位于一行时出现的,如下所示: ^(?=.{4})(?!.{32})(?!.*(.)\1{4})\w[\w.-]+\w$ <ul> <li id="letter" class="invalid">At least <strong>3 letters</strong></li> <li id="number" class="invalid">

我已经阅读了很多关于防止重复字符的堆栈溢出的答案,但这些都是在正则表达式字符串位于一行时出现的,如下所示:

^(?=.{4})(?!.{32})(?!.*(.)\1{4})\w[\w.-]+\w$
<ul>
  <li id="letter" class="invalid">At least <strong>3 letters</strong></li>
  <li id="number" class="invalid">At least <strong>2 numbers</strong></li>
</ul>

<input type="password" id="input-password" name="password" autocomplete="off">
我将这个概念用于密码验证,这意味着每次传递一个验证规则时,我都希望将一个有效类添加到列表项中。 密码字段上方有一个说明列表,如下所示:

^(?=.{4})(?!.{32})(?!.*(.)\1{4})\w[\w.-]+\w$
<ul>
  <li id="letter" class="invalid">At least <strong>3 letters</strong></li>
  <li id="number" class="invalid">At least <strong>2 numbers</strong></li>
</ul>

<input type="password" id="input-password" name="password" autocomplete="off">
我希望{3,}可以工作,但在本例中,它只验证3个字母是否连续,而不是它们是否出现在完整字符串的任何位置。e、 g.“a1aa”无效,但“aaa”有效。我已经读了很多书,但我只是不明白在这种情况下需要什么,因为我找不到其他例子,其中正则表达式已经像这样被拆分

有什么帮助吗

编辑

抱歉,正如NHAHDH所指出的,这个标题对于这个问题没有意义! 我实际上还有一个额外的验证要求,那就是密码不能重复同一个字母超过3次。例如,“mississippi”将无效,因为它有3个以上的字母“s”实例。

如何

if ( pwd.match(/[a-zA-Z]/g).length >= 3 ) {
怎么样

if ( pwd.match(/[a-zA-Z]/g).length >= 3 ) {

要将字符串与至少三个字母
a-Z
a-Z
匹配,可以使用

pwd.match( /(?:[^a-z]*[a-z]){3,}/i ) 
/^(?:[^A-Za-z]*([A-Za-z])(?!(?:.*?\1){3})){3,}[^A-Za-z]*$/
i
是不区分大小写的修饰符

正则表达式将匹配零个或多个非
A-Za-z
字符,后跟一个
A-Za-z
,三次或三次以上

?:
是可选的,使组
()
无法捕获

顺便说一句,如果您没有实际使用匹配,那么使用
test
比使用
match
更有效,例如

if ( /([^a-z]*[a-z]){3,}/i.test(pwd) ) {
进一步评论

为了满足额外的验证要求,您可以使用

/^(?:[^a-z]*([a-z])(?!(?:.*?\1){3})){3,}[^a-z]*$/i
它将只匹配一个至少有三个字母的字符串,并使用一个负的前瞻
(?!
和反向引用
\1
,以确保同一个字母(无论大小写)不会出现三次以上

或者,如果例如
“abcccC”
可以,因为第四个
C
是大写的,那么您可以使用

pwd.match( /(?:[^a-z]*[a-z]){3,}/i ) 
/^(?:[^A-Za-z]*([A-Za-z])(?!(?:.*?\1){3})){3,}[^A-Za-z]*$/

要将字符串与至少三个字母
a-Z
a-Z
匹配,可以使用

pwd.match( /(?:[^a-z]*[a-z]){3,}/i ) 
/^(?:[^A-Za-z]*([A-Za-z])(?!(?:.*?\1){3})){3,}[^A-Za-z]*$/
i
是不区分大小写的修饰符

正则表达式将匹配零个或多个非
A-Za-z
字符,后跟一个
A-Za-z
,三次或三次以上

?:
是可选的,使组
()
无法捕获

顺便说一句,如果您没有实际使用匹配,那么使用
test
比使用
match
更有效,例如

if ( /([^a-z]*[a-z]){3,}/i.test(pwd) ) {
进一步评论

为了满足额外的验证要求,您可以使用

/^(?:[^a-z]*([a-z])(?!(?:.*?\1){3})){3,}[^a-z]*$/i
它将只匹配一个至少有三个字母的字符串,并使用一个负的前瞻
(?!
和反向引用
\1
,以确保同一个字母(无论大小写)不会出现三次以上

或者,如果例如
“abcccC”
可以,因为第四个
C
是大写的,那么您可以使用

pwd.match( /(?:[^a-z]*[a-z]){3,}/i ) 
/^(?:[^A-Za-z]*([A-Za-z])(?!(?:.*?\1){3})){3,}[^A-Za-z]*$/

我宁愿写
=3
,因为它更接近描述-更容易检测bug。我在回答时也有同样的想法。没问题。实际上更新后,
A-z
将包含
z
A
之间的垃圾。使用
I
标志将其设置为
A-Za-z
,或
A-z
。是否执行WnDebug直到“代码”>“AZ/<代码>被纠正。如果没有匹配,也会引发异常,因为<代码> null <代码>没有<代码>长度<代码>。@ MiKem好调用空问题,没有想到这一点。确实考虑了AZ问题,但是使用了OP提供的值。您的答案肯定更好。heck很难看,所以我甚至不打算发布它;)我宁愿写
=3
,因为它更接近描述-更容易检测bug。我在回答时也有同样的想法。没问题。实际上更新后,
A-z
将包含
z
A
之间的垃圾。使用
I
标志将其设置为
A-Za-z
,或
A-z
。是否执行WnDebug直到“代码”>“AZ/<代码>被纠正。如果没有匹配,也会引发异常,因为<代码> null <代码>没有<代码>长度<代码>。@ MiKem好调用空问题,没有想到这一点。确实考虑了AZ问题,但是使用了OP提供的值。您的答案肯定更好。heck很难看,所以我甚至不打算发布它;)你所说的“至少3个字母”是什么意思?这是否意味着输入在任何位置都包含任何3个字母?另一件令人困惑的事情是——防止重复字符与您的问题有什么关系?对不起,NHAHDH,我的错误,让我自己对我所问的问题感到困惑。我在“编辑”下添加了更多的评论。在回答您的第一个问题时,密码在任何位置都必须至少有3个字母(大写或小写的a-z)。因此,至少有3个字母(不要介意重复)和至少3个不同的字母是要求中的2个?希望我不必登录到您创建的系统:)我们有过争论,但失败了:(-我不喜欢的角色是让这些高强度的安全要求对用户来说似乎很简单。如果你感兴趣,我会把这个想法放在js fiddle中,“至少3个字母”是什么意思-这是否意味着输入在任何位置包含任何3个字母?另一个让人困惑的问题是-防止重复字符与您的问题有什么关系?抱歉,nhahtdh,我的错误,让我对我的问题感到困惑。我在“编辑”下添加了更多注释。在回答您的第一个问题时,密码必须在任何位置至少有3个字母(大写或小写的a-z),所以至少有3个字母(不要用c)