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

时间:2013-05-01 07:18:26

标签: jquery regex validation

我已经阅读了很多关于防止重复字符的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个字母''的实例。

2 个答案:

答案 0 :(得分:2)

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

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

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是大写的,然后您可以使用

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

答案 1 :(得分:1)

怎么样

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