允许使用正则表达式

时间:2016-04-19 11:39:32

标签: regex

我有一个正则表达式来验证密码:至少一个大写,一个小写,一个数字和一个特殊字符:

^(?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z])(?=\D*\d)(?=.*[$@$!%*?&,;.:-_])[A-Za-z\d$@$!%*?&,;.:-_]+

但我也想允许空,因为我会以另一种方式验证它。

所以我试着选择:

^((?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z])(?=\D*\d)(?=.*[$@$!%*?&,;.:-_])[A-Za-z\d$@$!%*?&,;.:-_]+)*$

注意:我在()中包装了Regex并在最后添加了* $;

或以下内容:

^$|(?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z])(?=\D*\d)(?=.*[$@$!%*?&,;.:-_])[A-Za-z\d$@$!%*?&,;.:-_]+

注意:添加$ |一开始......

最好的方法是什么?这些中的一个还是其他一个?

1 个答案:

答案 0 :(得分:1)

如果您的正则表达式匹配至少某些,而不是整个字符串,则需要使用$的替换:

^(?:(?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z])(?=\D*\d)(?=.*[$@$!%*?&,;.:_-])[A-Za-z\d$@$!%*?&,;.:_-]+|$)
^^^^                                                                                        ^^^

请参阅regex demo。看:

  • ^ - 字符串开头
  • (?: - 交替小组开始
    • (?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z])(?=\D*\d)(?=.*[$@$!%*?&,;.:_-])[A-Za-z\d$@$!%*?&,;.:_-]+ - 匹配此
    • | - 或......
    • $ - 字符串结束。
  • ) - 交替结束

如果您的模式与整个字符串匹配(例如,^\d+\s+\w+$以匹配12 Apr之类的字符串),并且您还希望匹配空字符串,则可以使用可选项进行封装图案:

^(?:\d+\s+\w+)?$
 ^^^         ^^

详细说明:

  • ^ - 字符串开头
  • (?:\d+\s+\w+)? - 1 + digtis的一个或零个序列,然后是1 +个空格,然后是1个字母数字/下划线
  • $ - 字符串结尾