蓝桥杯:IP判断


看到这题第一个想法就是题目要考查字符串的截取,将一个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);

		}

	}

}

实现效果

原文地址:https://www.cnblogs.com/lyd447113735/p/12673536.html