我需要一个正则表达式来匹配以下规则。
1. Atleast 1 numerical character.
2. Atleast 1 of these (!, @, #, $, %, _) non-alphanumeric characters.
3. Uppercase alphabets.
4. Lowercase alphabets
我尝试创建如下图案,但事情是任何角色都可以处于任何位置。我有点被困在这里。
^[[A-Z]+[a-z]+[0-9]+[!@#\\$%_]+]$
这些应满足上述每个条件。
1. [0-9]+
2. [!@#\\$_%]+
3. [A-Z]+
4. [a-z]+
但是我如何将它们组合在一起,以便它们可以按任何顺序出现,但每组最多只发生一次。
解决方案:
^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[!@#$%_])[A-Za-z0-9!@#$%_]*$
答案 0 :(得分:5)
您需要使用positive lookahead assertions分别独立检查每个条件:
^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[!@#$%_]).*$
将匹配包含每个字符中至少一个的任何字符串(但也可能包含其他字符)。
前瞻实际上并不参与匹配(这就是为什么你可以将它们放在另一个之后 - 它们都锚定在字符串的开头),但是他们看到它们中包含的正则表达式是否可以< / em>在当前位置匹配。
<强>说明:强>
^ # 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.
答案 1 :(得分:1)
最简单的解决方案是不检查单个正则表达式中的所有内容。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatches
{
public static void main( String args[] ){
// String to be scanned to find the pattern.
String line = "S9s_3g90ae98iogw4i%%%%%%%!@!89fh#453&!";
if ( line.matches("\\d") // at least one digit
&& line.matches("[!@#\\\\$_%]") // at least one special character
&& line.matches("[a-z]") // at least one lowercase
&& line.matches("[A-Z]") // at least one uppercase
) {
System.out.println("Found value: ");
} else {
System.out.println("NO MATCH");
}
}
}
您可以使用图灵完整的编程语言。不要试图用正则表达式来解决所有问题(就像我爱他们一样)。