目前,我正在使用我发现的长度限制:
<input #password="ngModel" type="password" name="password" minlength="5" maxlength="30" pattern="((?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,20})" required ngModel>
它有效,但我不想在最后限制长度。我不太了解正则表达式,所以我假设最后删除{6,20}
会完成工作,但我错了。
所以我的问题是:如何在没有长度限制的情况下使这个正则表达式工作?谢谢!
答案 0 :(得分:6)
您正在使用默认情况下锚定正则表达式的HTML5 pattern attribute(它实际上使用^(?:
和)$
包装模式。这意味着模式必须匹配整个字符串。这就是为什么你不能取出.{6,20}
并保持前瞻的原因。
您需要在开头使用前瞻,并在结尾使用.*
(允许输入中包含0个或更多个字符)或.+
(禁止空输入)(作为消费模式)部分):
pattern="(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*"
这将成功翻译为/^(?:(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*)$/
并按预期方式运作:
^
- 字符串开头(?:
- 非捕获组的开始
(?=.*\d)
- 需要当前位置的任何0+字符后的1位数(?=.*[a-z])
- 需要当前位置的任何0+字符后的1个小写字母(?=.*[A-Z])
- 需要当前位置的任何0+字符后的1个大写字母.*
- 任意0个或更多字符)
- 非捕获组的结束$
- 字符串结束。