RegEx至少1个数字,1个小写字母和1个大写字母

Jes*_*per 7 regex

目前,我正在使用我发现的长度限制:

<input #password="ngModel" type="password" name="password"  minlength="5" maxlength="30" pattern="((?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,20})" required ngModel>
Run Code Online (Sandbox Code Playgroud)

它有效,但我不想在最后限制长度.我对正则表达式了解不多,所以我认为{6,20}最后删除会完成工作,但我错了.

所以我的问题是:如何在没有长度限制的情况下使这个正则表达式工作?谢谢!

Wik*_*żew 9

您正在使用默认情况下锚定正则表达式的HTML5 模式属性(它实际上用^(?:和包装模式)$).这意味着模式必须匹配整个字符串.这就是为什么你不能拿出.{6,20}并保持前瞻的原因.

您需要在开头使用前瞻,并且.*(在输入中允许0个或更多个字符)或.+(以禁止空输入)结尾(作为消费模式部分):

pattern="(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*"
Run Code Online (Sandbox Code Playgroud)

这将成功翻译成/^(?:(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*)$/并按预期工作:

  • ^ - 字符串的开头
  • (?: - 开始非捕获组
    • (?=.*\d) - 需要当前位置的任何0+字符后的1位数字
    • (?=.*[a-z]) - 在当前位置的任何0+字符之后需要1个小写字母
    • (?=.*[A-Z]) - 在当前位置的任何0+字符之后需要1个大写字母
  • .* - 任何0或更多字符
  • ) - 非捕获组的结束
  • $ - 字符串结尾.