密码正则表达式与任何三个组合,但没有空格

时间:2016-06-22 15:58:29

标签: java regex

确保密码符合以下条件

  • 长度:8-32个字符
  • 密码必须包含以下至少3个:大写,小写,数字,符号
  • 密码不得包含空格
  • 允许密码字符:

    !@#$%^*()_+Aa1~`-={}[]|\:;"',.?/
    

我试过了:

^.*(?=.*[a-z])(?=.*[A-Z])(?=.*[\d\W])^(?!.*[&])(?=.*[!@#$%^*()_+Aa1~`\-={}[\]|\:;"',.?/])\S{8,32}$

我写了这个正则表达式,但强制执行一个不应该是这样的大写字母.......它应该接受大写,小写,数字,符号的任意三种组合:

!@#$%^*()_+Aa1~`-={}[]|\:;"',.?/

正则表达式限制限制为255个字符。任何建议对此都有帮助。

2 个答案:

答案 0 :(得分:1)

^(?:[A-Z]()|[a-z]()|[0-9]()|[!@#$%^*()_+~`={}\[\]|\:;"',.?/-]())+$(?:\1\2\3|\1\2\4|\1\3\4|\2\3\4)

以更易阅读的形式:

^
(?:
   [A-Z] () |
   [a-z] () |
   [0-9] () |
   [!@#$%^*()_+~`={}\[\]|\\:;"',.?/-] ()
)+
$
(?:
   \1\2\3 |
   \1\2\4 |
   \1\3\4 |
   \2\3\4
)

我正在做的是使用空的捕获组作为复选框,计算在比赛过程中看到的各种角色。因此,例如,如果字符串中没有大写字母,则组#1从不参与匹配,因此\1最终不会成功。除非所有其他三个小组都参加,否则比赛将失败。

请注意,此技术并不适用于所有风格。例如,在JavaScript中,即使该组没有参与比赛,对空组的反向引用也会成功。

答案 1 :(得分:0)

您可以使用:

^(?=.*[!@#$%^*()_+~`={}|:;"',.?\[\]\/-].*)(?=.*[A-Z].*)(?=.*[a-z].*)[\w!@#$%^*()_+~`={}|:;"',.?\[\]\/-]{8,32}$|
^(?=.*[!@#$%^*()_+~`={}|:;"',.?\[\]\/-].*)(?=.*\d.*)(?=.*[a-z].*)[\w!@#$%^*()_+~`={}|:;"',.?\[\]\/-]{8,32}$|
^(?=.*[!@#$%^*()_+~`={}|:;"',.?\[\]\/-].*)(?=.*[A-Z].*)(?=.*\d.*)[\w!@#$%^*()_+~`={}|:;"',.?\[\]\/-]{8,32}$|
^(?=.*\d.*)(?=.*[A-Z].*)(?=.*[a-z].*)[\w!@#$%^*()_+~`={}|:;"',.?\[\]\/-]{8,32}$

请参阅LiveDemo

如果您想要更多灵活性,可以使用它:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Dummy{
   public static void main(String []args){
      String password = "aaaZZZ111";
      String specials = "!@#$%^*()_+~`={}|:;\"',.?\\[\\]\\/-";
      String uppercase = "A-Z";
      String lowercase = "a-z";
      String numbers = "\\d";
      String all = specials + uppercase + lowercase + numbers;
      int min = 8;
      int max = 32;

      String regex =
         "^" + lookahead(specials) +  lookahead(uppercase) + lookahead(lowercase) + "[" + all + "]{"+ min +"," + max + "}$|" +
         "^" + lookahead(specials) +  lookahead(uppercase) + lookahead(numbers) + "[" + all + "]{"+ min +"," + max + "}$|" +
         "^" + lookahead(specials) +  lookahead(lowercase) + lookahead(numbers) + "[" + all + "]{"+ min +"," + max + "}$|" +
         "^" + lookahead(uppercase) + lookahead(lowercase) + lookahead(numbers) + "[" + all + "]{"+ min +"," + max + "}$";

      Pattern r = Pattern.compile(regex);

      Matcher m = r.matcher(password);
      if (m.find()) {
         System.out.println("OK");
      } else {
         System.out.println("NO MATCH");
      }
   }

   public static String lookahead(String input) {
      return "(?=.*[" + input + "].*)";
   }
}