密码必须符合以下4条规则中的3条:
(1)大写字母、
(2)小写字母、
(3)数字、
(4)特殊字符(`~!@#$%^*()+-=|[]{}:;',.>/\?) 
关键在任何三条,满足任何一条都没什么问题。
写了半天 还是没有一个能够完全匹配的,哪位大侠能给点提示?不要在无满意结贴了! 在这先谢过了

解决方案 »

  1.   

    去下个正则表达式的文档看下吧,CSDN就有的,看了你就明白了
      

  2.   

    (?!X)吧举个例子
    Windows98 Windows2000 WindowsXPWindows(?=98),匹配Windows98中的Windows,但不匹配Windows2000,WindowsXP中的Windows
    Windows(?!98),刚好相反,匹配Windows2000,WindowsXP中的Windows,但不匹配Windows98中的Windows(?<=Windows)98,匹配Windows98中的98,但不匹配1998的98
    (?<!Windows)98,匹配1998中的98,但不匹配Windows98的98
      

  3.   

    零宽度负预测先行断言(?!exp),断言此位置的后面不能匹配表达式exp。例如:\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字;\b((?!abc)\w)+\b匹配不包含连续字符串abc的单词。
      

  4.   

    1句regex貌似很难,下面的代码对于大部分情况已经能够判断。但是还是有bug
      public static void main(String[] args) throws Exception {
        System.out.println("============TRUE=============");
        System.out.println(test("abc"));
        System.out.println(test("ABC"));
        System.out.println(test("123"));
        System.out.println(test(",,,"));
        System.out.println("============FALSE============");
        System.out.println(test("aB1"));
        System.out.println(test("aBc1"));
        System.out.println(test("A1c"));
        System.out.println(test("xY,abc"));
        System.out.println(test("AAAAbbbbCCCC1111,,,,"));
        System.out.println(test("aAbB1,1Cc"));
        System.out.println("========以下判断错误==========");
        System.out.println(test("aAa"));
        System.out.println(test("aBc"));
        System.out.println(test("1,1"));
      }  static boolean test(String str) {
        String regex = "(?:.*(?:\\p{Punct}+(?!\\p{Punct})|[A-Z]+(?![A-Z])|[a-z]+(?![a-z])|\\d+(?!\\d))){3,}";
        return str.matches(regex);
      }
    4种不同的
      

  5.   

    正则啊
    一般我直接google
    或者去找个在线帮助的那种
      

  6.   

    非常感谢!看了最后的正则表达虽然不能满足要求,但阁下对正则的理解让人仰慕。
    能不能给小弟我讲讲,正则里面:特殊构造(非捕获) 
    (?:X) X,作为非捕获组         X不被匹配
    (?idmsux-idmsux)  Nothing,但是将匹配标志由 on 转为 off       不明白
    (?idmsux-idmsux:X)   X,作为带有给定标志 on - off 的非捕获组   不明白
    (?=X) X,通过零宽度的正 lookahead     x不被匹配那和1有什么区别?
    (?!X) X,通过零宽度的负 lookahead     零宽度?是没有间隔?
    (?<=X) X,通过零宽度的正 lookbehind   
    (?<!X) X,通过零宽度的负 lookbehind 
    (?>X) X,作为独立的非捕获组     ?这个有啥用以上内容的白话讲法?
      

  7.   

    OK,对于深入了解regex,绝对建议买那本猫头鹰书:
    书回去翻过了,不过暂时还没找到比较好的解决方法。1. 捕获
    括号的作用,除了配对外,更重要的就是capture捕获。see Matcher.group
    捕获的含义
    比如我要
    替换A1A,A2A,B3B为AA1,AA2,BB3 
        String[] array = new String[] {
            "A1A", "A2A", "B3B"
        };
        for (String string : array) {
          System.out.println(string.replaceAll("([A-Z])(\\d)\\1", "$1$1$2"));
        }([A-Z])匹配第一个字母,且将其捕获为第一个捕获组 group(1),
    (\d),匹配第二个的数字,且捕获为第二组
    \1,反向引用,内容是动态的,具体内容就是最近一次匹配时,第一组的内容replaceAll后面那个参数,也是反向引用。如果只是想用括号表达优先度,不想作为捕获组的话,那么就用(?:XXXXXX)==============================================(?is..)开关,
    lz应该知道Pattern.compile(regex,这里有个开关选项),这个开关是全局的,而(?is..)开关是局部
    下面以大小写开关i , Pattern.CASE_INSENSITIVE为例    // 全局不区分大小写
        Pattern pattern1 = Pattern.compile("ab", Pattern.CASE_INSENSITIVE);
        Matcher matcher1 = pattern1.matcher("AB--ab--Ab--aB");
        while (matcher1.find()) {
          System.out.println(matcher1.group()); // BTW,整个匹配就是第0组捕获
        }
        System.out.println("=====================");
        // 仅在开关之间不区分大小写
        Pattern pattern2 = Pattern.compile("(?i)a(?-i)b");
        Matcher matcher2 = pattern2.matcher("AB--ab--Ab--aB");
        while (matcher2.find()) {
          System.out.println(matcher2.group()); // BTW,整个匹配就是第0组捕获
        }
        System.out.println("=====================");
        // 仅在括号内不区分大小写,而且这个括号不是捕获组
        Pattern pattern3 = Pattern.compile("(?i:a)b");
        Matcher matcher3 = pattern3.matcher("AB--ab--Ab--aB");
        while (matcher3.find()) {
          System.out.println(matcher3.group()); // BTW,整个匹配就是第0组捕获
        }
      

  8.   

    (?:X)匹配,但不捕获
    环视lookahead、lookbehind,会在匹配段前后座测试    String test = "Windows家族包括了Windows95、Windows98、Windows2000、WindowsXP";
        String[] regex = new String[] {
            "(Windows)(\\d+)", // group(1) = Windows, group(2) = 数字, group(0) = Windows数字
            "(?:Windows)(\\d+)", // group(1) = 数字, group(0) = Windows数字
            "Windows(?=\\d+)", // 不会匹配Windows家族和WindowsXP,但group(0) = Windows,后面没有数字
        };
        for (String r : regex) {
          Pattern pattern = Pattern.compile(r);
          Matcher matcher = pattern.matcher(test);
          System.out.println("=====" + r + "=====");
          while (matcher.find()) {
            System.out.printf("group(0)=%s%n", matcher.group());
            for (int i = 1; i <= matcher.groupCount(); i++) {
              System.out.printf("group(%d)=%s%n", i, matcher.group(i));
            }
            System.out.println("-----------");
          }
        }=====(Windows)(\d+)=====
    group(0)=Windows95
    group(1)=Windows
    group(2)=95
    -----------
    group(0)=Windows98
    group(1)=Windows
    group(2)=98
    -----------
    group(0)=Windows2000
    group(1)=Windows
    group(2)=2000
    -----------
    =====(?:Windows)(\d+)=====
    group(0)=Windows95
    group(1)=95
    -----------
    group(0)=Windows98
    group(1)=98
    -----------
    group(0)=Windows2000
    group(1)=2000
    -----------
    =====Windows(?=\d+)=====
    group(0)=Windows
    -----------
    group(0)=Windows
    -----------
    group(0)=Windows
    -----------