在HTML模式中积极向前看?

时间:2018-08-27 13:20:21

标签: html regex

<input type="password" pattern="^(?=^[A-Z])(?=.{8,16})(?=.*?[a-z])(?=.*?[A-Z])(?=.*?[1-9])(?=.*[$@$!%*#?&-])">

我有这个HTML,但是我似乎无法使我的模式正常工作。我不确定是否支持正向搜索,或者我实际上没有在整个字符串中搜索该模式。

编辑: 这应该通过:MySafe-Password1 这应该失败:MySaferPassword

2 个答案:

答案 0 :(得分:1)

所有命题都是超前的,它产生一个空字符串,您必须将其中一个保持为“真实”:

"^(?=^[A-Z])(?=.*?[a-z])(?=.*?[A-Z])(?=.*?[1-9])(?=.*[$@$!%*#?&-]).{8,16}$"

我在这里进行长度测试。

答案 1 :(得分:1)

验证密码的一般规则是:

  • ^开始。
  • 针对所有条件(除了最后一个条件)都进行一些积极的前瞻。
  • 为最后一个条件放入“普通”匹配项,通常与长度有关(例如.{8,16})。
  • $结尾。

所以尝试:

^(?=[A-Z])(?=.*?[a-z])(?=.*?[1-9])(?=.*[$@!%*#?&-]).{8,16}$

我认为:

  • (?=.*?[A-Z])是不必要的,因为您已经检查了 大写字母。
  • 无需重复^(在第一次查找中)。
  • 无需重复$(在上一次查找中)。
  • 正则表达式必须匹配某些内容,因此我将.{8,16}移到了最后, (无需查找)。