正则表达式模式匹配这些规则

Ada*_*rsh 1 java regex

我需要一个正则表达式来匹配以下规则.

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)

Tim*_*ker 5

您需要使用正向前瞻断言来单独和独立地检查每个条件:

^(?=.*[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)