使用RegEx作为输入模式来验证密码

时间:2019-04-01 19:40:07

标签: html regex

我有一个密码字段,我需要检查它是否至少包含8个字符以及是否包含以下字符:

  

! @#$%^&*

我尝试使用模式进行操作,但未按预期工作:

<div class="col-sm-6 form-group">
   <input type="password" class="form-control" id="Clave" name="txtClave" 
   pattern='/[!@#$%^&*(),.?":{}|<>]/g.{8,}' 
   title="Debe contener uno de los siguientes caracteres: ! @ # $ % ^ & *, y al menos 8 o más caracteres" required>
</div>

2 个答案:

答案 0 :(得分:0)

尝试使用正则表达式:^(?=.*[!@#$%^&*(),.?":{}|<>]).{8,}$

Demo

答案 1 :(得分:0)

在单个正则表达式中组合多个测试的最佳机制是lookahead。普通的正则表达式会在字符串中移动以查找匹配项,这意味着找到匹配项后,它不再位于字符串的开头。前行查找匹配项而实际上没有移动(因此名称为“前行”)。基本格式为(?=<regex>),您可以将任意数量的组合成一个模式。

在这种情况下,您有两个条件,因此需要合并两个先行条件。我们已经看过第一个.{8,}了,但是在向前看时,您需要的还不止于此:您需要确保regex与整个字符串匹配。因此,以\A(与字符串开头匹配的锚点)开始模式,并以\z(与字符串结尾匹配的锚点)结束前行。放在一起,模式的第一部分是\A(?=.{8,}\z)。 (在您的特定情况下,此预防措施是不必要的,因为您将接受八个以上字符的密码,但这仍然是一种好习惯。)

第二个条件匹配八个特定字符中的任何一个,以类[!@#$%^&*]开头。但是在从字符串的开头开始并且永远不会移动的前瞻中,该类将仅匹配第一个字符。您需要一个与字符串中任意位置匹配的正则表达式。一种简单的方法是.*[!@#$%^&*],它匹配零个或多个字符,后跟一个特殊字符。向前看,将为(?=.*[!@#$%^&*])。但是,“简单”并不总是最好的:.*构造效率相对较低,因为它总是检查整个字符串,然后在继续之前必须回溯到开始,这在计算上可能是昂贵的。

[^!@#$%^&*]*[!@#$%^&*]是执行此类操作的一种更有效的方法。这将匹配零个或多个特殊字符集中的 not 字符,后跟一个字符。 (插入式(^作为括号类中的第一个字符意味着对该类取反;插入该类中其他位置的插入式只是作为该类成员的文字插入式。)由于它进行检查,因此效率更高仅在字符串中位于其位置之前的字符,并且一旦找到匹配项就可以立即停止。放眼望去,可以给我们(?=[^!@#$%^&*]*[!@#$%^&*])

现在,您可以将两个前行简单地组合到您的“样式”中,如下所示:

pattern='\A(?=.{8,}\z)(?=[^!@#$%^&*]*[!@#$%^&*])'

该密码应与八个或更多字符的任何密码匹配,其中至少一个是您的八个特殊字符之一:! @#$%^&*