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