验证规则:
- 1 每个字符要么是分隔符.要么是数字;
- 2 分隔符有3个,且不能连续;
- 3 分隔后:
- 每段长度不能大于3;
- 每段要么是0,要么不能以0开头;
- 转为数字值后不能大于255。
拆分段:
public static boolean validate(String ip){
if (null == ip) {
return false;
}
// 分隔段
char[] segment = null;
// 分隔段长度
int segSize = 0;
// 分隔符个数
int seperatorCount = 0;
char[] arr = ip.trim().toCharArray();
for (int count = 0; count < arr.length; count++) {
char c = arr[count];
// 只能出现分隔符.和数字
if (c != 46 && (c < 48 || c > 57)) {
//ascii : 46->. 48..57->0..9
return false;
}
if (c == 46) {
// 当前是分隔符
if(++seperatorCount > 3){
return false;
}
if (segSize == 0 || null == segment) {
// 不能以分隔符开头
return false;
}
if(count == arr.length - 1){
// 不能以分隔符结尾
return false;
}
if(segment[segSize-1] == 46){
// 不能连续两个分隔符
return false;
}
// 验证分段
if (!validateSegment(segment, segSize)) {
return false;
}
// 验证完成,segment置null
segment = null;
continue;
}
// 重新初始化segment
if (null == segment) {
segment = new char[3];
segSize = 0;
}
if (segSize + 1 > 3) {
// segment不能超过3
return false;
}
//当前字符放入segment,同时segSize递增
segment[segSize++] = c;
// 最后一个字符 结束再次判断
if (count == arr.length - 1) {
if (!validateSegment(segment, segSize)) {
return false;
}
}
}
if(seperatorCount != 3){
return false;
}
return true;
}
验证分隔段:
private static boolean validateSegment(char[] segment, int segSize) {
if(segSize == 0){
return false;
}
if (segSize > 1 && segment[0] == '0') {
// segment不能0开头
return false;
}
Integer checkValue = Integer.valueOf(String.valueOf(Arrays.copyOf(segment, segSize)));
if (checkValue > 255) {
return false;
}
return true;
}