看到这题第一个想法就是题目要考查字符串的截取,将一个IP地址中的4个位段中的数字截取出来,再进行判断看符不符合规则。简单的说就是考查字符串的处理,既然是对字符串处理,那除了截取字符串再进行判断这种方法以外,用正则进行处理也很方便。比赛的时候突然想不到用正则的话,规规矩矩的用截取再判断也挺稳的,就是比较啰嗦。
解析一:
第一种方法是用split()方法将IP地址中的四个位段中的数据截取出来,之后就按照常用的方法根据题目要求对着四个数据进行判断了,如果四个数据都符合题意,就返回'Y'。另外这里多提一个点,对整数前导0的判断有两种实现方法,一种是通过字符串的下标,对这个字符串的首字符进行判断,如果是0就返回'N';另一种方式是调用String的startsWith()方法进行判断.额外说一下,题目会要求对字母的情况也进行判断,是因为大小写的英文字母在ASCII表中都有对应的数字,字符状态下会变成数字进行输出,所以要字母进行单独处理。使用第一种方法因为要将字符串转换成整形,所以进行异常抛出就行了;使用正则就更方便了,不对字母进行匹配就好了。
解析一的代码:
package _12_26_test;
import java.awt.PageAttributes;
import java.awt.print.PageFormat;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
* 通过匹配符号.切割出四个数据
* 对四个数据进行范围判断
* A.B.C.D
* 使用split()方法进行切割或者使用if进行切割,推荐使用split()
*
*
* */
public class seven {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String flag = "Y";
String get = scanner.next();
// 对ip地址进行切割,分成四个数据放进数组中
String num[] = get.split("\.", 4);
for (int i = 0; i < 4; i++) {
try {
// 通过startsWith()方法判断数据是否有前导0
if (num[i].startsWith("0") && num[i].length() != 1) {
flag = "N";
break;
}
// 判断数据大小是否在[0,255]之间
int IntNum = Integer.parseInt(num[i]);
if (IntNum >= 0 && IntNum <= 255) {
continue;
} else {
flag = "N";
break;
}
} catch (Exception e) {
/*
* 因为上面有使用到Integer.parseInt()方法将String类型的数字转变成int类型,
* 如果数据是字母就会抛出异常,所以这里使用try catch可以处理字母判断这个问题
* */
flag = "N";
break;
}
}
System.out.println(flag);
}
}
}
解析二:
第二种方法就是用正则表达式去匹配了,这种方法如果对正则掌握的比较熟的话很方便,只要注意匹配式不要写错就行了。重点就是匹配式的梳理,这里根据题目要求可以分成三种情况:
第一种:一个数字,这种情况最简单,直接使用d或者[0-9]就行了
第二种:两个数字,这种情况要注意开头的数字不能为0,因为题目要求前导0不能为0,第二个数字可以任意,使用[1-9]d可以实现。
第三种:三个数字,三个数字的情况最啰嗦,不但要注意前导数为0的情况,还要注意最大值的判断。因为最大值是255,所以第一个数字只能是1或2。
- 第一个数字为1的时候,后面两个数字可以任意匹配,无论怎么取值都不会超过255,使用1dd可以实现。
- 第二个数字为2的时候分为两种情况,如果第二个数不是5,那第三个数就可以取任意值,无论怎么取都不会超过255,使用2[0-4]d可以实现;当第二个数是5时,第三个数最大不能超过5,使用25[0-5])可以实现
解析二代码
package _12_26_test;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
* 根据题目要求,每个ip地址中的位段数据需要符合以下要求
* 1、数据在[0,255]的范围内
* 2、数据不能是英文字母,因为英文字母在ASCII码中也是一个数字
* 3、数据的前导不能为0
* 使用正则表达式:
* */
public class eight {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String flag = "Y";
String num = sc.nextLine();
/*
* 一个数字:
* 两个数字:1或者2开头,第二个数字可以随机
* 三个数字:1或者2开头,如果第二个数字小于5,第三个数字可以随机
* 如果第三个数字等于5,第三个数字最大值为5
*/
String regex = "(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])."
+ "(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])."
+ "(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])."
+ "(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(num);
if (matcher.matches()) {
flag = "Y";
} else {
flag = "N";
}
System.out.println(flag);
}
}
}