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

Asi*_*eed 2 regex asp.net-mvc-3

我有以下要求:

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

我创造了这个:

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

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

Ala*_*ore 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
Run Code Online (Sandbox Code Playgroud)