匹配至少【三位数字三位字母】,可以出现在任意位置

解决方案 »

  1.   

    就是比如aaa123 a1a2a3 aa12a3 等等字母和数字至少出现3次最多不超过20次例如aa1234这样的不能匹配
      

  2.   

    try...^(?=([^0-9]*[0-9]){3,20})(?=([^a-zA-Z]*[a-zA-Z]){3,20}).{6,}$
      

  3.   


    //一定是要求一次匹配判断吗?可以曲线解决不?
        String s = "dfgdfgtest123456hehe";
        if(s.replaceAll("\\D","").matches("^\\d{3,20}$") && s.replaceAll("[^a-zA-Z]","").matches("^[a-zA-Z]{3,20}$")){
          System.out.println("pass");
        }
    //比如替换掉所有非数字,剩下的看长度lenth()或者看匹配,这样不行么?
      

  4.   


    找到问题所在了,[^0-9]与[^a-zA-Z]的范围太大,把回车换行\r\n也包括在内了,因此进行多行匹配测试的时候,判断是会出现问题的。将\r\n也排除在外就ok了。
    修改为:
      ^(?=([^0-9\r\n]*[0-9]){3,20})(?=([^a-zA-Z\r\n]*[a-zA-Z]){3,20}).{6,}$
    不过若是在整段的文章中匹配的话,修改成这样要更好些。这种一般是匹配用户名什么的吧,呵呵
      (?=([^0-9\s]*[0-9]){3,20})(?=([^a-zA-Z\s]*[a-zA-Z]){3,20})\w{6,}
      

  5.   


    你怎么测试的,给下你的测试代码
    String[] data = new String[]{"aaa123", "a1a2a3", "aa12a3", "aa1234", "a1a223"};
    String regex = "^(?=([^0-9]*[0-9]){3,20})(?=([^a-zA-Z]*[a-zA-Z]){3,20}).{6,}$";
    Pattern pattern=Pattern.compile(regex);
    for(int i=0;i<data.length;i++)
    {
    System.out.println(data[i] + "   匹配结果:   " + pattern.matcher(data[i]).find());
    }
    /*--------输出-------
    aaa123   匹配结果:   true
    a1a2a3   匹配结果:   true
    aa12a3   匹配结果:   true
    aa1234   匹配结果:   false
    a1a223   匹配结果:   false
    */
      

  6.   

    呵呵  我是在Regexbuddy里测的。把字符串一整段贴进去进行匹配的,然后就发现了6L 的问题。
      

  7.   

    过客的正则很牛逼呀,佩服...这个高级用法以前没使过(?=([^0-9]*[0-9]){3,20})(?=([^a-zA-Z]*[a-zA-Z]){3,20})
      

  8.   

    过客的正则还是存在一个问题:当总数大于20的字母或数字,被分割成3-20之间的小段时候,能匹配,比如
    "abc1abc1abc1abc1abc1abc1abc1abc1abc1"
      

  9.   


    嗯,确实,限定条件有点考虑不充分^(?=([^0-9]*[0-9]){3,20}[^0-9]*$)(?=([^a-zA-Z]*[a-zA-Z]){3,20}[^a-zA-Z]*$).{6,}$