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

时间:2013-11-20 12:27:09

标签: java regex

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

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!@#$%_]*$

2 个答案:

答案 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");
      }
   }
}

您可以使用图灵完整的编程语言。不要试图用正则表达式来解决所有问题(就像我爱他们一样)。