我需要一个正则表达式来匹配以下规则.
1. Atleast 1 numerical character.
2. Atleast 1 of these (!, @, #, $, %, _) non-alphanumeric characters.
3. Uppercase alphabets.
4. Lowercase alphabets
Run Code Online (Sandbox Code Playgroud)
我尝试创建如下的模式,但事情是任何角色都可以处于任何位置.我有点被困在这里.
^[[A-Z]+[a-z]+[0-9]+[!@#\\$%_]+]$
Run Code Online (Sandbox Code Playgroud)
这些应满足上述每个条件.
1. [0-9]+
2. [!@#\\$_%]+
3. [A-Z]+
4. [a-z]+
Run Code Online (Sandbox Code Playgroud)
但是我如何将它们组合在一起以便它们可以按任何顺序出现,但每个组最常出现一次.
解决方案
^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[!@#$%_])[A-Za-z0-9!@#$%_]*$
Run Code Online (Sandbox Code Playgroud)
您需要使用正向前瞻断言来单独和独立地检查每个条件:
^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[!@#$%_]).*$
Run Code Online (Sandbox Code Playgroud)
将匹配包含每个字符中至少一个的任何字符串(但也可能包含其他字符).
前瞻实际上并不参与匹配(这就是为什么你可以将它们放在另一个之后 - 它们都锚定在字符串的开头),但是它们看看它们中包含的正则表达式是否可以在当前位置匹配.
说明:
^ # Start of string.
(?= # Look ahead to see if it's possible to match...
.* # any string
[A-Z] # followed by one uppercase ASCII letter.
) # End of lookahead.
(?=.*[a-z]) # Same for lowercase ASCII letter
(?=.*[0-9]) # Same for ASCII digit
(?=.*[!@#$%_]) # Same for this list of "special" characters
.* # Now match any string.
$ # End of string.
Run Code Online (Sandbox Code Playgroud)