最近迷上了正则,对预搜索始终不得要领,请帮忙解释下
//验证一个字符串,必须包含不少一个大写字母,一个小写字母,一个数字, 字符串的长度为6-10
String reg1 = "^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9]).{6,10}$";
String testStr = "aA001a";
问题1,能否解释下这个表达式,主要是前面3个组问题2,在消化过程中,想写如下需求的表达式,
//验证一个字符串,中间为abc,abc 两边必须包含不少于一个大写字母,一个小写字母,一个数字,且这个长度为3-6;
String testStr = "1bBabcBb1";

解决方案 »

  1.   

    哎,重复的问题啦,关于这个我在 CSDN 说过 N 次了!参考下面两个帖子:http://topic.csdn.net/u/20080715/22/bacb749b-2f47-4552-8e9f-83099d5e0fe4.htmlhttp://topic.csdn.net/u/20080716/22/80cdd418-a0e9-4e7e-8435-df6d4bc11c4a.html
    另外还有一些其他语法解释和例子的帖子,有兴趣的话可以去看看。http://topic.csdn.net/u/20080627/14/8a91b33a-f35c-4303-85b5-e0a8da462202.htmlhttp://topic.csdn.net/u/20080325/17/fb7a3e8d-029a-4d8e-89ae-77a9d28ec301.htmlhttp://topic.csdn.net/u/20080503/01/3c82b040-43b9-4b44-847d-07b366285957.htmlhttp://topic.csdn.net/u/20080520/19/175eb3fa-e3b0-4330-b274-e7e9dabc93c0.htmlhttp://topic.csdn.net/u/20080610/17/15b8828c-43d5-43c5-803e-1f4d51ffb213.htmlhttp://topic.csdn.net/u/20080313/14/a070f343-7fb3-4c19-86ba-36b56c780295.htmlhttp://topic.csdn.net/u/20080529/18/6c4e70e9-4510-4af0-8874-207c5a9a1788.html
      

  2.   

    (?=exp)也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp。比如\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.时,它会匹配sing和danc。注意(?=ing)匹配dancing的前半部分。而不会匹配dancing因为它只匹配但不消耗字符串。^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9]).{6,10}$
    第一个括号代表在开始后此位置期望有任意个小写字母,或任意个大写字母,或任一个数字,但必须是6-10位的。如果还不理解,请google:零宽断言 或 向前查看与向后查看
      

  3.   


    这个问题有问题啊,长度为 3~6,“abc,abc”已经是 7 个字符了,这还没算上两边的字符!另外,“两边必须包含不少于一个大写字母,一个小写字母,一个数字”是指每边都得包含这些,
    还是两边总共得包含这些啊?好复杂啊~~
      

  4.   

    先谢谢果子是两边都得包含,那个长度是指包含的长度
    比如 String testStr = "1bBabcBb1";
    1bB(左边长度为3)
    abc 中间是abc
    Bb1(这个长度也为3)
      

  5.   

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;public class Test01 {
        
        public static void main(String[] args) {
            String[] test = {
                    "1aTabc2Fk", "1a2abc2Fk", "KaTabc2Fk",
                    "1aTabc23k", "1aTabck",   "aaa1aTabc2Fk",
                    "aaaa1aTabc2Fk", "aaa1aTabc25a4Fk",
                    "1Tabcabcabc2Ta", "abc2cHabcabcK7a",
                    "7HcabcabcabccH7", "$7c@=Kabc_6@K*d"
                };
            String regex = 
                    "(?=[^a-z]*[a-z].*(abc))" +
                    "(?=[^A-Z]*[A-Z].*\\1)" +
                    "(?=[^0-9]*[0-9].*\\1)" +
                    ".{3,6}" +
                    "\\1" +
                    "(?=[^a-z]*[a-z])" +
                    "(?=[^A-Z]*[A-Z])" +
                    "(?=[^0-9]*[0-9])" +
                    ".{3,6}";
            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher("");
            for(int i = 0; i < test.length; i++) {
                System.out.printf("%18s %-5s%n", 
                        test[i], 
                        matcher.reset(test[i]).matches()
                    );
            }
        }
    }         1aTabc2Fk true 
             1a2abc2Fk false
             KaTabc2Fk false
             1aTabc23k false
               1aTabck false
          aaa1aTabc2Fk true 
         aaaa1aTabc2Fk false
       aaa1aTabc25a4Fk true 
        1Tabcabcabc2Ta true 
       abc2cHabcabcK7a true 
       7HcabcabcabccH7 true 
       $7c@=Kabc_6@K*d true不知道是这个意思么?
      

  6.   

    太强大了,谢谢果子了啊,
    你是mm的话,我肯定拜倒在你石榴裙下,是gg么,就拜为师了,呵呵
    有空我把你所有的正则帖子整理一下^*o*^