//==============================================================================
//
// @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
//
// @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
反正
String tcpAddr = "tcp:10.8.9.116/655";是true
String tcpAddr = "tcp:10.8.9.116/10000 是false
还是false。
关注。。
所以我现在怀疑是JSE的bug
这个我又试过,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的字符串长度”。
R_1_65535_REGEX,前后要加括号(内部的括号倒是可以都不需要)。
因为“|”如果没有括号包裹,就变成了顶级的“或”查找了