Regex 为什么我的正则表达式在未列出方括号时接受方括号

Regex 为什么我的正则表达式在未列出方括号时接受方括号,regex,Regex,在正则表达式(?=^.{6,10}$)(?=.*\\d)(?=.[a-z])(?=.[a-z])(?=.[!@.+$%^.*(:'?>.,])(?!.\\s.*$),为什么aA1!111]会通过规则组中的特殊字符(?=.[![.+.++.-%%%.+.-%^.*.}.+++>,],我没有跳过方括号,因此我认为它们之间的任何内容都应该被接受,而不是方括号本身您误解了/误解了积极前瞻的实际作用。正则表达式中的积极前瞻要求某些字符出现,但它们不声明任何与此相关的内容无法显示哪些字符。以下是您的正则

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

您误解了/误解了积极前瞻的实际作用。正则表达式中的积极前瞻要求某些字符出现,但它们不声明任何与此相关的内容无法显示哪些字符。以下是您的正则表达式的稍微修改版本:

^
    (?=.*\\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\]\[])

为了可读性,我在这里只转义一次,但是您的正则表达式语言可能需要双重转义。

为了使方括号不被接受为输入,请将它们包含在这类字符中:
(?=.[!@$%^&;*():\'?>.])
(?=.\\d)
是“有反斜杠和
d
"@Tomalak.取决于所使用的语言/工具,正如我所提到的。同样在Java中。正则表达式和用于传递正则表达式的字符串文字是不同的东西。你假设正则表达式在Java字符串中使用。我不同意这个假设。;(OPs帖子中没有任何关于Java的提示。是的,我知道这是吹毛求疵。但是当我如果一个正则表达式没有上下文,我认为它应该只遵循正则表达式的约定。这样,它会变得噪音更小,更适用于各种正则表达式方言。双重转义严格来说是宿主语言的要求,不应该包括在内,除非示例正则表达式是专门为所讨论的宿主语言编写的,即使用上下文。a您是否将此正则表达式与Java语言一起使用?如果不是,您的确切正则表达式工具是什么?