0

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

^(?=.{4})(?!.{32})(?!.*(.)\1{4})\w[\w.-]+\w$

我正在使用此概念进行密码验证http://www.webdesignerdepot.com/2012/01/password-strength-verification-with-jquery/这意味着我希望每次将一个有效类添加到列表项中验证规则通过。密码字段上方有一个说明列表,如下所示:

<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">

如果用户输入满足这一点,则指令旁边会打勾。

所以我有:

var pwd = $(this).val();

if ( pwd.match(/[A-z]{3,}/) ) {
        $('#letter').removeClass('invalid').addClass('valid');
    } else {
        $('#letter').removeClass('valid').addClass('invalid');
    }
if ( pwd.match(/\d{2,}/) ) {
        $('#number').removeClass('invalid').addClass('valid');
    } else {
        $('#number').removeClass('valid').addClass('invalid');
    }

我希望 {3,} 可以工作,但在这种情况下,它只验证 3 个字母是否连续,而不是它们是否出现在完整字符串中的任何位置。例如“a1aa”是无效的,但“aaa”是有效的。我已经阅读了很多,但我只是不明白在这种情况下需要什么,因为我找不到像这样拆分正则表达式的其他示例。

有什么帮助吗?

编辑

抱歉,正如 nhahtdh 指出的那样,标题与问题无关!我实际上还有一个额外的验证要求,即密码不能重复同一个字母超过 3 次。例如,'mississippi' 无效,因为它有超过 3 个字母 's' 实例。

4

2 回答 2

2

要匹配至少包含三个字母的字符串,A-Z a-z您可以使用

pwd.match( /(?:[^a-z]*[a-z]){3,}/i ) 

i是不区分大小写的修饰符。

正则表达式将匹配零个或多个 notA-Za-z的字符,后跟一个字符A-Za-z3 次或更多次。

是可选的?:并且使组()不被捕获。

顺便说一句,使用test它比match您实际上不使用匹配更有效,例如

if ( /([^a-z]*[a-z]){3,}/i.test(pwd) ) {

进一步评论

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

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

它只会匹配一个至少包含三个字母的字符串,并且它使用否定的前瞻(?!和后向引用\1来确保相同的字母(无论大小写)不会出现超过 3 次。

或者,如果 eg"abcccC"没问题,因为第四个C是大写的,那么你可以使用

/^(?:[^A-Za-z]*([A-Za-z])(?!(?:.*?\1){3})){3,}[^A-Za-z]*$/
于 2013-05-01T08:10:30.373 回答
1

怎么样

if ( pwd.match(/[a-zA-Z]/g).length >= 3 ) {
于 2013-05-01T07:27:27.393 回答