(?!^[0-9]*$)(?!^[a-zA-Z]*$)^([a-zA-Z0-9]{6,10})$   密码由数字和字母组成,不能含有符号的长度为6到10请高手们给我详细解释一下。

解决方案 »

  1.   

    (?!^[0-9]*$):排除从头到尾都是数字的情况
    (?!^[a-zA-Z]*$):排除从头到尾都是字母的情况
    ^([a-zA-Z0-9]{6,10})$:字母和数字的组合,6-10位长度
      

  2.   

    其实我的问题就在这里。这个正则式实际是只允许输入字母和数字并且长度要在6-10之间。(?!^[0-9]*$):排除从头到尾都是数字的情况,为什么又可以输入数字呢?
    (?!^[a-zA-Z]*$):排除从头到尾都是字母的情况,为什么又可以输入字母呢?
      

  3.   


    System.out.println("ddd".matches("(?!^[0-9]*$)"));//false
      

  4.   

    晕了,零宽断言上面必然是不匹配
    System.out.println("ddd".matches("(?!^[0-9]*$).*$"));//true
      

  5.   

    Matcher m=Pattern.compile("(?!^[0-9]*$)").matcher("ddd");
    //因为上面那个是从开始到结束不能是数字的检验,因为已经到了字符串结束 所以匹配开始位置不会改变,
    //,所以只匹配了开始位置,显然与整个字符串不匹配。所以只会有下面的匹配结果
    while(m.find())
    System.out.println(m.group()+"**");//匹配四次分别是 @所在位置 即 @d@d@d@ 
    //其实上面的第一个@也就是^,最后一个也就是$.
    //一下四个是等价的对于匹配""
    System.out.println("".matches("(?:^)"));//匹配后面只有字符串开始
    System.out.println("".matches("(?:$)"));//匹配$也就是字符串结束 
    System.out.println("".matches("(?:^$)"));//匹配开始后直接是结束
    System.out.println("".matches("(?:)"));//匹配空

    Matcher ma=Pattern.compile("(?:[0-9]*)").matcher("123");
    while(ma.find())
    System.out.println(ma.group()+"@@");
    //结果
    //123@@ 从开始匹配最多个数的数字
    //@@  这里也就是匹配了$,也就是0个数字
    //开会去了。看能明白不?
      

  6.   

    所谓零宽断言的意思是,用于查找在某些内容(但并不包括这些内容)之前或之后的东西
    即,对查找出来的子段的之前或之后有限制,但是这些限制并不会包含有查找出来的子段中例如:比如\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.时,它会匹配sing和danc。
    零宽断言分四种