为什么我的可选字符没有被捕获?

时间:2016-06-17 15:10:11

标签: javascript regex

我正在尝试创建一个正则表达式来测试密码。我现在检查以下内容:

  • 一个大写字母
  • 一个小写字母
  • 一个号码

目前,用户无法输入特殊字符,但我尝试将其添加为可选检查(因此Testing1和Testing1!都应匹配)。我试过了:

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

但它并没有抓住它。我有一种感觉,我的特殊字符设置在错误的位置,但我不知道放在哪里。

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

1 个答案:

答案 0 :(得分:3)

您可以通过多种方式设置正则表达式,例如为字符类型创建白名单或黑名单。这个特别为可以使用的角色创建了白名单,这似乎是您正在寻找的。

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

由于您说您希望将特殊字符作为可选字符,因此它们只是放在可以键入的可能字符中,但它们不会被任何正面的前瞻验证。

regex101上查看此正则表达式。请注意,修饰符gm可以在此示例中跨行进行验证,并且可能应在您的用例中删除。

当然,你可能有理由"白名单"方法,但一个更常见的方法,你可能想要尝试尝试的方法,是允许几乎任何东西(黑名单),然后验证是否满足某个标准。