为什么我的正则表达式没有列出方括号就接受

时间:2018-11-11 13:54:03

标签: regex

在正则表达式(?=^.{6,10}$)(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*()_+}{":\'?&gt.<,])(?!.*\\s).*$')中,为什么aA1!111]通过?在特殊字符(?=.*[!@#$%^&*()_+}{":\'?&gt.<,])的规则组中,我没有逃脱过方括号,因此我认为应该接受它们之间的任何内容,但不接受方括号本身

2 个答案:

答案 0 :(得分:2)

您正在误解/误解了积极的前瞻实际上是做什么的。正则表达式中的正向先行要求必须存在某些字符,但它们并不能断定不能存在哪些字符。这是您的正则表达式的略微修改版本:

^
    (?=.*\\d)                                       -- has a number
    (?=.*[a-z])                                     -- has lowercase
    (?=.*[A-Z])                                     -- has uppercase
    (?=.*[!@#$%^&*()_+}{":\'?&gt.<,])   -- has a symbol
    (?!.*\\s)                                       -- has no whitespace
.{6,10}                                             -- between 6 and 10 characters
$

如果您想将样式限制为不允许不允许使用方括号和其他字符,则可以修改(?!.*\s)否定超前术语,例如

(?!.*[\s\]\[])

出于可读性考虑,我在这里仅转义一次,但是您的正则表达式语言可能需要两次转义。

答案 1 :(得分:0)

为使方括号不被接受为输入,请将其包含在以下字符类别中:(?=.*[!@#$%^&*()_+}{":\'?&gt.<,])