Javascript 为什么我的可选角色没有被抓到?

Javascript 为什么我的可选角色没有被抓到?,javascript,regex,Javascript,Regex,我正在尝试创建一个正则表达式来测试密码。我的当前版本检查以下各项: 一个大写字母 一个小写字母 一个数字 目前,用户无法输入特殊字符,但我尝试将其作为可选检查添加(因此Testing1和Testing1!应该都匹配)。我试过: ^(?=.[A-Za-z])(?=.*\d)(?=.[$$!%*.*?&])(A-Za-z\d[$$!%*.*.?&]){8,}$ 但它没有抓住它。我感觉我的特殊角色集放错了地方,但我不确定该放在哪里 我在哪里添加特殊字符列表作为可选检查?有许多方法可以设置正则表达式

我正在尝试创建一个正则表达式来测试密码。我的当前版本检查以下各项:

  • 一个大写字母
  • 一个小写字母
  • 一个数字
目前,用户无法输入特殊字符,但我尝试将其作为可选检查添加(因此Testing1和Testing1!应该都匹配)。我试过:

^(?=.[A-Za-z])(?=.*\d)(?=.[$$!%*.*?&])(A-Za-z\d[$$!%*.*.?&]){8,}$

但它没有抓住它。我感觉我的特殊角色集放错了地方,但我不确定该放在哪里


我在哪里添加特殊字符列表作为可选检查?

有许多方法可以设置正则表达式,例如为字符类型创建白名单或黑名单。这一个特别创建了一个可以使用的字符的白名单,这似乎是你正在寻找的

^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])[A-Za-z0-9$@$!%*#?&]{8,}$
正则表达式细分:

^ // Assert position at start of the line
(?=.*[A-Z]) // First positive lookahead, makes sure a capital character exists
(?=.*[a-z]) // Make sure a lowercase character exists
(?=.*[0-9]) // Make sure a number exists
[A-Za-z0-9$@$!%*#?&] // All of the possible characters that can be typed
{8,} // 8 to infinity characters
$ // Assert position at end of line
因为您说您希望特殊字符作为可选字符,所以它们只是放在可以键入的可能字符中,但它们不会被任何正面的lookahead验证

在上查看此正则表达式的操作。请记住,在本例中,修饰符
gm
用于跨行验证,在您的用例中可能应该删除


当然,您可能有理由使用“白名单”方法,但一种更常见的方法,您可能希望尝试一下,就是允许几乎任何东西(黑名单),然后验证是否满足特定标准。

有许多方法可以设置正则表达式,例如创建白名单或黑名单,用于字符类型。这一个特别创建了一个可以使用的字符的白名单,这似乎是你正在寻找的

^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])[A-Za-z0-9$@$!%*#?&]{8,}$
正则表达式细分:

^ // Assert position at start of the line
(?=.*[A-Z]) // First positive lookahead, makes sure a capital character exists
(?=.*[a-z]) // Make sure a lowercase character exists
(?=.*[0-9]) // Make sure a number exists
[A-Za-z0-9$@$!%*#?&] // All of the possible characters that can be typed
{8,} // 8 to infinity characters
$ // Assert position at end of line
因为您说您希望特殊字符作为可选字符,所以它们只是放在可以键入的可能字符中,但它们不会被任何正面的lookahead验证

在上查看此正则表达式的操作。请记住,在本例中,修饰符
gm
用于跨行验证,在您的用例中可能应该删除


当然,您可能有理由使用“白名单”方法,但一种更常见的方法,您可能希望尝试一下,就是允许几乎任何东西(黑名单),然后验证是否满足特定标准。

是您的第二个
$@$!%*&假设也是一个字符类?是的。错误地粘贴了一个旧命令。我认为您可以允许任何带有
^(?=.[A-Z])(?=.[A-Z])(?=.[0-9])(?=.[$@$!%*.\\\\.&])。{8,}$
的内容,但需要一个具有前瞻性的特殊字符。如果您使用
[A-Za-z0-9$@$!%*.?&]{8,}
,您将无法输入say
\
。您的第二个
$!%*.\&假设也是一个字符类?是的。错误地粘贴了一个旧命令。我认为您可以允许任何带有
^(?=.[A-Z])(?=.[A-Z])(?=.[0-9])(?=.[$@$!%*.\\\\.&])。{8,}$
的内容,但需要一个具有前瞻性的特殊字符。如果您使用
[A-Za-z0-9$@$!%*#?&]{8,}
,您将无法输入say
ń
。所以我不必将这些字符定义为它们自己的可选组?我可以把它们放在我的角色集中吗?@BDD,没错。正则表达式的这部分:
[A-Za-z0-9$@$!%*#?&]{8,}
是定义可键入内容的部分。在
[
]
之间定义“可能”字符,但不定义所需字符。完美。谢谢你的澄清!所以我不必将这些字符定义为它们自己的可选组?我可以把它们放在我的角色集中吗?@BDD,没错。正则表达式的这部分:
[A-Za-z0-9$@$!%*#?&]{8,}
是定义可键入内容的部分。在
[
]
之间定义“可能”字符,但不定义所需字符。完美。谢谢你的澄清!