//==============================================================================
//
// @author Slive
// @date  2013-6-18
//
//==============================================================================
package org.slive.validator;import java.util.regex.Matcher;
import java.util.regex.Pattern;/**
 * ValidatorUtil supplies many ordinary validation functions,such as:<br/>
 * <ul>
 *  <li> ipv4 address validate
 *  <li> device mac address validate
 * </ul>
 * @author Slive
 */
public class ValidateUtil
{
    public static final String IPV4_REGEX = "([1-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3}";
    public static final String MAC_REGEX = "([0-9A-Fa-f]{2})(-[0-9A-Fa-f]{2}){5}";
    public static final String R_1_65535_REGEX = "([1-9](\\d{0,3}))|([1-5](\\d{4}))|(6553[0-5])|(655[0-2]\\d)|(65[0-4](\\d{2}))|(6[0-4](\\d{3}))";
    public static final String IPV4_PORT_REGEX = IPV4_REGEX + "(\\/)" +  R_1_65535_REGEX;
    public static final String UDP_IPV4_PORT_REGEX = "([uU][dD][pP])(\\:)" + IPV4_PORT_REGEX;
    public static final String TCP_IPV4_PORT_REGEX = "([tT][cC][pP])(\\:)" + IPV4_PORT_REGEX;
    
    /**
     * Legal ipv4 address follow as: "xxx(1-255).xxx.xxx.xxx(0-255)"
     * @param ipv4 ipv4 address
     * @return if ipv4 is null, it will return false;
     * @see #IP_REGEX
     */
    public static boolean ipV4Validate(String ipv4){
     return ipv4Validate(ipv4,IPV4_REGEX);
    }
    
    /**
     * Legal device mac address follow as: "xx-xx-xx-xx-xx(0-9a-f)"
     * @param mac device mac address
     * @return if mac is null, it will return false;
     * @see #MAC_REGEX
     */
    public static boolean macValidate(String mac){
     return ipv4Validate(mac,MAC_REGEX);
    }
    
    /**
     * Legal address follow as:"udp:127.0.0.1/1080"
     * @param udpIpv4Port
     * @see #UDP_IPV4_PORT_REGEX
     */
    public static boolean udpIpv4PortValidate(String udpIpv4Port){
     return ipv4Validate(udpIpv4Port,UDP_IPV4_PORT_REGEX);
    }
    
    /**
     * Legal address follow as:"tcp:127.0.0.1/1080"
     * @param tcpIpv4Port
     * @see #TCP_IPV4_PORT_REGEX
     */
    public static boolean tcpIpv4PortValidate(String tcpIpv4Port){
     return ipv4Validate(tcpIpv4Port,TCP_IPV4_PORT_REGEX);
    }
    
    /**
     * Legal address follow as:"127.0.0.1/1080"
     * @param ipv4Port
     * @see #IPV4_PORT_REGEX
     */
    public static boolean ipv4PortValidate(String ipv4Port){
     return ipv4Validate(ipv4Port,IPV4_PORT_REGEX);
    } private static boolean ipv4Validate(String addr,String regex) {
if(addr == null){
     return false;
     }
     else{
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(addr);
boolean b = m.matches();
return b;
//     return Pattern.matches(regex, addr.trim());
     }
}
    
    public static void main(String[] args) {
     for (int i = 0; i < 65537; i++) {
if(!("" + i).matches(R_1_65535_REGEX)) // 校验是否是1-65535的范围内
{
System.out.println(i);
}
}
    
     // TODO
     System.out.println();
     String udpAddr = "udp:127.0.0.1/655";
//     String udpAddr = "udp:127.0.0.1/65535";  //此地址会出错,y?
     System.out.println("UdpAddr validates result:" + udpIpv4PortValidate(udpAddr));
    
     String tcpAddr = "tcp:10.8.9.116/10000";
     System.out.println("TcpAddr validates result:" + tcpIpv4PortValidate(tcpAddr));
}
    
}
如上代码,测试检验是否形如“udp|tcp:xxx.xxx.xxx.xxx/xxx(1-65535)”等的地址是否是有效的,检验"udp:127.0.0.1/655"时没问题,检验"udp:127.0.0.1/65535"时却出错了(单单测试检验1-65535是否有效却没问题),哪位大侠帮忙找找原因?
java

解决方案 »

  1.   

    难道是String.matches限制了regex的字符串长度?
      

  2.   

    有道理
    反正
    String tcpAddr = "tcp:10.8.9.116/655";是true
    String tcpAddr = "tcp:10.8.9.116/10000 是false
      

  3.   

    不对,我试了一下10.8.9.116/10000,
    还是false。
    关注。。
      

  4.   


    所以我现在怀疑是JSE的bug
      

  5.   


    这个我又试过,10000是临界点。改一下代码:
    for (int i = 0; i < 65537; i++) {
                if(!("/" + i).matches("/" + R_1_65535_REGEX))        // 校验是否是1-65535的范围内
                {
                    System.out.println(i);
                }
            }
    10000以后的都能打印出来,估计也不是“String.matches限制了regex的字符串长度”。
      

  6.   

    难道10000以后都能打印出来不是正说明了R_1_65535_REGEX不match么?
      

  7.   

    问题找到了:
    R_1_65535_REGEX,前后要加括号(内部的括号倒是可以都不需要)。
    因为“|”如果没有括号包裹,就变成了顶级的“或”查找了