目前,我正在使用我发现的长度限制:
<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}最后删除会完成工作,但我错了.
所以我的问题是:如何在没有长度限制的情况下使这个正则表达式工作?谢谢!
您正在使用默认情况下锚定正则表达式的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或更多字符) - 非捕获组的结束$ - 字符串结尾.