我有一个正则表达式,它有以下规则:
+ Must contain lower case letters
+ Must contain upper case letters
+ Must contain a number
+ Must contain a (defined)special character
+ At least 8 chars
这有效,我的正则表达式如下:
((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[~@#\$%\^&\*_\-\+=`|{}:;!\.\?\"()\[\]]).{8,25})
现在我想只在一件事中改变那个正则表达式: 特殊字符应该仍然是可能的(并且只有我允许的那些),但在字符串中的任何地方都应该是可选的(不再需要)。 所以新规则将是
+ MAY contain (defined) special characters
为实现这一目标我需要做些什么改变?
示例:
NicePassw0rd - NOT OK now, should be
NicePassw0rd%% - OK now (and still should be)
NicePassword - NOT OK now and shouldnt
您可以在那里测试我的正则表达式:https://regex101.com/r/qN5dN0/1
答案 0 :(得分:7)
您必须在模式的两端添加锚点^
和$
才能真正启用长度检查。如果您想禁止使用其他特殊字符,请使用字母和数字将~@#$%^&*+=`|{}:;!.?\"()\[\]-
移至消费部分(请注意,如果您使用不带{{1}的PCRE,则[A-Za-z0-9_]
与\w
相同} flag:
/u
请参阅regex demo
这是它的作用:
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[\w~@#$%^&*+=`|{}:;!.?\"()\[\]-]{8,25}$
- 字符串开头^
- 至少需要一位数字(?=.*\d)
- 至少需要一个小写的ASCII字母(?=.*[a-z])
- 要求至少1个ASCII大写字母(?=.*[A-Z])
- 匹配(=使用)8到25个只有字母数字或[\w~@#$%^&*+=`|{}:;!.?\"()\[\]-]{8,25}
的符号,或者字符类中的所有符号_
- 字符串结尾当我们检查除了那些我们需要检查存在的字符之外的0个或更多字符然后是所需符号时,更有效的是基于前导中contrast principle的正则表达式。查看包含$
的正确的正则表达式:
(?=\D*\d)(?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z])