正则表达式:可选的特殊字符

时间:2015-11-24 10:06:07

标签: regex

我有一个正则表达式,它有以下规则:

+ 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

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])