正则表达式将字符串长度限制为固定值

时间:2019-07-18 08:31:13

标签: regex

我需要正则表达式在我的角度项目中使用它来验证密码,正则表达式必须遵守以下要求:

-6个字符。

-至少包含一个大写字母。

-一个小写字母。

-一个数字。

-没有空格

我写了以下正则表达式:

(?=.*[a-z])(?=.*[A-Z])(?=.*\d)

这将验证至少一个数字,一个大写字母,一个小写字母,但不验证字符串的长度。

要强制用户输入特殊字符(例如6个字符):

((?=.*[a-z])(?=.*[A-Z])(?=.*\d)){6}

长度仍然无法正常工作:

Aabcd1->成功,因为6个字符,并且包含大写字母,小写字母,数字。

Aabcd->失败,因为5个字符。

Aabcd12->成功,尽管有7个字符!

我还需要防止空格。

我在这里错过了什么?

2 个答案:

答案 0 :(得分:1)

我建议您使用单个regexen进行测试:

[0-9]    // Test #1 for numbers
[A-Z]    // Test #2 for uppercase
[a-z]    // Test #3 for lowercase
\s       // Test #4 for Whitespace, invert test result
^.{6}$   // Test #5 for length

仅在所有测试成功后才接受密码。

这似乎有些过分,但可以轻松更改PW策略,并可以轻松地以密码失败的方式向用户反馈。

此方法还允许对禁止的(sub)字符串进行相当简单的测试,例如用户名是密码的一部分。在您使用短密码的情况下,这可能不是很重要的原因,但是如果PW策略将更改,则可能更相关。

答案 1 :(得分:1)

我猜您忘了添加字符串锚点的开始和结束(分别为^$)。

您的最后一个测试用例匹配,因为它不必在第六个之后考虑任何字符,并且实际上Aabcd1与您的正则表达式匹配

尝试一下:

^((?=.*[a-z])(?=.*[A-Z])(?=.*\d)){6}.{6}$

我要做的就是添加锚点,并使用.{6}将长度限制为6个字符。

Regex101 (with your examples)