至少包含1个数字、1个小写字母和1个大写字母的正则表达式

12

目前,我正在使用一个带有长度限制的表达式:

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

它能够工作,但我不想在结尾处有长度限制。我对正则表达式不是很了解,所以我认为删除结尾的{6,20}就可以完成任务,但我错了。

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


4
尝试使用pattern="(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).+" - anubhava
1
@anubhava 谢谢,解决了!我之前尝试过只用 +,所以我很接近了。看来你还需要那个 . 哈哈。 - Jesper
@chris85 那样行不通。 - Jesper
1个回答

17
你正在使用一个HTML5 pattern 属性,默认情况下它会将正则表达式锚定(实际上是用^(?:)$包装模式)。这意味着模式必须匹配整个字符串。这就是为什么你不能只删除.{6,20}并保留前瞻的原因。
你需要在开头使用前瞻,并在结尾使用.*(允许输入中有0或更多个字符)或.+(不允许空输入作为消费模式部分):
pattern="(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*"

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接