我正在尝试找出一个匹配包含
的密码的正则表达式我写的正则表达式是
^((?=.*[0-9])(?=.*[A-Z])(?=.*[^A-Za-z0-9])){4,}
然而它不起作用,我无法弄清楚原因。
所以请有人告诉我为什么这段代码不起作用,我在哪里搞砸了,以及如何纠正这段代码。
答案 0 :(得分:1)
您的正则表达式可以重写为
^(
(?=.*[0-9])
(?=.*[A-Z])
(?=.*[^A-Za-z0-9])
){4,}
如您所见{4,}
适用于不允许您匹配任何字符的群组,因为环视为零宽度,这实际上意味着" 4或更多没有任何"。
您需要在.
之前添加{4,}
以让您的正则表达式处理"以及至少4个字符的长度"点(休息由环顾处理)
您可以删除该捕获组,因为您并不真正需要它。
所以试试像
这样的东西^(?=.*[0-9])(?=.*[A-Z])(?=.*[^A-Za-z0-9]).{4,}
答案 1 :(得分:0)
你可以拿出某事。像:
^(?=.*[A-Z])(?=.*\d)(?=.*[!"§$%&/()=?`]).{4,}$
在多线模式下,请参阅a demo on regex101.com 这种方法直接指定了特殊字符(显然可以扩展) 从以下列表中,只有粗体符合以下条件:
您仍然可以通过更具体和需要相反的对来增强此表达式。只是为了提醒你,点星(.*
)会让你失望,然后最终回溯。这几乎总是需要更多的步骤,而不是直接寻找相反的对
请考虑以下表达式:
^ # bind the expression to the beginning of the string
(?=[^A-Z\n\r]*[A-Z]) # look ahead for sth. that is not A-Z, or newline and require one of A-Z
(?=[^\d\n\r]*\d) # same construct for digits
(?=\w*[^\w\n\r]) # same construct for special chars (\w = _A-Za-z0-9)
.{4,}
$
你会看到a significant reduction in steps因为正则表达式引擎不必每次都回溯。