在正则表达式中使特殊字符可选

时间:2012-01-18 12:03:33

标签: regex asp.net-mvc-3

我有以下要求:

密码必须为6-18个字符,并且至少包含一个字母和一个数字。允许使用特殊字符,例如@,%和&,#。

我创造了这个:

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

但是它也接受像_这样的其他特殊字符,它要求@%&#中的一个特殊字符必须是字符串。我想让这个可选。意味着如果用户输入其中一个特殊字符,则字符串应该有效,但如果用户没有输入这些字符,那么它不应该是无效的。如果用户输入任何其他特殊字符,则字符串应无效。

4 个答案:

答案 0 :(得分:6)

正如其他响应者所说的那样,.*与那些不需要的角色相匹配。第一个.*根本不应该存在,第二个应该用字符类替换。

或者甚至更好,在第一个前瞻的末尾添加$;现在它验证了长度和构图。最后的.*和前瞻中的两个是可以的,因为组合已经过验证。

^(?=[A-Za-z0-9@%&#]{6,18}$)(?=.*\d)(?=.*[A-Za-z]).*$

or, more readably:

^                             # start of string
(?=[A-Za-z0-9@%&#]{6,18})$    # length and composition
(?=.*\d)                      # required digit
(?=.*[A-Za-z])                # required letter
.*                            # go ahead and consume it
$                             # end of string

答案 1 :(得分:2)

'。'允许换行符旁边的任何字符(\ n),所以如果省略正则表达式的最后一部分,它应该做你需要的:

^.*(?=.{6,18})(?=.*\d)(?=.*[A-Za-z]).*$

如果您想要某些字符不被允许,例如'_',您可以将它们放在负面的前方,例如。

^.*(?=.{6,18})(?=.*\d)(?=.*[A-Za-z])(?!.*[_]).*$

字符串中不允许使用'_'和'*'。

答案 2 :(得分:0)

对于长度,只需使用字符串长度函数。

然后只测试您的输入是否符合[0-9], [A-Za-z] and ^ [0-9A-Za-z @%&#] + $`。

答案 3 :(得分:0)

而不是使用“。”它允许几乎所有东西,使用类似的东西:

[0-9a-zA-Z@#%&]