榜样:
- package cn.test;
- /**
- *
- 要求:用Java代码做以下正则匹配,模拟用户注册时,验证填写信息的准确性
- 1、匹配邮箱
- 2、匹配手机号
- 3、匹配密码(6~12位之间,不能为纯数字)
- 4、匹配IP(IPv4)
- *
- */
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- import java.util.Scanner;
- public class RegexTest {
- public static void main(String[] args) {
- RegexTest regexTest=new RegexTest();
- Scanner sc=new Scanner(System.in);
- while(true){
- System.out.println("模拟用户注册");
-
- System.out.println("请输入您的邮箱地址:");
- verify(regexTest,"regexEmail",sc);
-
- System.out.println("请输入您的手机号码:");
- verify(regexTest,"regexPhoneNum",sc);
- System.out.println("请输入您的密码:");
-
- verify(regexTest,"regexPassword",sc);
- System.out.println("请输入您的IP地址:");
-
- verify(regexTest,"regexIP",sc);
- System.out.println("恭喜您注册成功!!");
- System.out.println("是否继续?输入Y继续,其他任意键回车后退出");
-
- if("Y".equalsIgnoreCase(sc.nextLine())){
- continue;
- }else{
- break;
- }
- }
- sc.close();
- }
-
-
- //验证方法(为了节省代码,用反射的方式进行)
- private static void verify(RegexTest regexTest, String methodName, Scanner sc) {
- //获取对象的字节码
- Class<? extends RegexTest> clazz=regexTest.getClass();
- Method m=null;
- try {
- //得到验证的方法
- m=clazz.getMethod(methodName, String.class);
- } catch (NoSuchMethodException | SecurityException e1) {
- throw new RuntimeException("没有该验证方法!");
- }
- while(true){
- String str=sc.nextLine();
- try {
- m.invoke(regexTest, str);
- System.out.println("验证通过!");
- break;
- } catch (Exception e) {
- //获取原方法抛出的异常
- InvocationTargetException te=(InvocationTargetException)e;
- System.out.println(te.getTargetException().getMessage());
- continue;
- }
- }
- }
- /*
- * ipv4一共四段,如192.168.1.234,每一段中最大数字时255最小为0,可以分为三中情况(中括号内代表当前位置可以出现的数字)
- * 一.以2开头的3位数:25[0-5],24[0-9],正则表达式表示可以为:2[0-4]\\d|25[0-5]
- * 二.以1开头的3位数:1[0-9][0-9],正则表达式表示可以为:1\\d{2}
- * 三.两位数或三位数时,两位数[1-9][0-9],一位数时[0-9],可以合并为一中情况:[1-9]?\\d
- */
- public boolean regexIP(String str) {
- String regex = "(([1-9]?\\d|1\\d{2}|2[0-4]\\d|25[0-5])\\.){3}(([1-9]?\\d|1\\d{2}|2[0-4]\\d|25[0-5]))";
- boolean t = str.matches(regex);
- if(t){
- return true;
- }else{
- throw new RuntimeException("您的ip地址不合法!请重新输入:");
- }
- }
- // 邮箱格式xxxx@xx.xx(末尾可以有多个.xx,每段的字符大于一个),精确验证,第一段可以是单词字符:[a-zA-Z_0-9],第二段为非“_”的单词字符,第三段及之后只能是字母
- public boolean regexEmail(String str) {
- String regex = "\\w+@[\\w&&[^_]]+(\\.[a-zA-Z]+)+";
- boolean t = str.matches(regex);
- if(t){
- return true;
- }else{
- throw new RuntimeException("您的邮箱格式不合法!请重新输入:");
- }
- }
- // (6~12位之间,不能为纯数字),分两次验证,首先验证长度,再验证密码是否合法
- public boolean regexPassword(String str) {
- String regex = ".{6,12}"; //判断6~12位
- boolean t = str.matches(regex);
- if (str.matches(str)) {
- regex = "\\d+"; //判断纯数字
- t = str.matches(regex);
- if(!t){
- return true;
- }
- }
- throw new RuntimeException("您的密码格式不合法!请重新输入:");
- }
- /*
- * 手机号码段中国电信手机号码开头数字 2G/3G号段(CDMA2000网络)133、153、180、181、189 4G号段 177
- * 中国联通手机号码开头数字 2G号段(GSM网络)130、131、132、155、156 3G号段(WCDMA网络)185、186 4G号段 176
- * 中国移动手机号码开头数字
- * 2G号段(GSM网络)有134x(0-8)、135、136、137、138、139、150、151、152、158、159
- * 、182、183、184。 3G号段(TD-SCDMA网络)有157、187、188 4G号段 178补充
- * 170号段为虚拟运营商专属号段,170号段的 11 位手机号前四位来区分基础运营商,其中 “1700” 为中国电信的转售号码标识,“1705”
- * 为中国移动,“1709” 为中国联通。 卫星通信 1349
- */
- // 手机号码可以分为13xxxxxxxxx,15xxxxxxxxx,18xxxxxxxxx,4G的17[6-8]xxxxxxxx和虚拟运营商专属号段170[059]
- public boolean regexPhoneNum(String str) {
- String regex = "(1[358]\\d\\d|17[6-8]\\d|170[059])\\d{7}";
- boolean t = str.matches(regex);
- if(t){
- return true;
- }else{
- throw new RuntimeException("您的手机号码格式不合法!请重新输入:");
- }
- }
- }
复制代码 |