您的位置 首页 java

「Java工具类」Java正则匹配工具类RegexUtils

介绍语

本号主要是Java常用关键技术点,通用工具类的分享;以及springboot+springcloud+Mybatisplus+druid+mysql+redis+swagger+maven+docker等集成框架的技术分享;datax、 kafka 、flink等大数据处理框架的技术分享。文章会不断更新,欢迎码友关注点赞收藏转发!

望各位码友点击关注,冲1000粉。后面会录制一些视频教程,图文和视频结合,比如:图书介绍网站系统、抢购系统、大数据中台系统等。技术才是程序猿的最爱,码友们冲啊

如果码友觉得代码太长,可以从头到尾快速扫射一遍,了解大概即可。觉得有用后再转发收藏,以备不时之需。

正文:

先上一个需求,要求前端输入一条语句,实现简单加减乘除功能,例如x+y-z,后端处理后变为’x’+’y’-‘z’,使用java正则实现,代码如下:

  String input = "x+y-z";
 String r = "\\*|\\/|\\+|\\-";
 Matcher m = Pattern.compile(r).matcher(input);
  StringBuilder  colStringBuilder = new StringBuilder();
 int start = 0;
 while (m.find()) {
     String symbol = m.group();
     String field = input.substring(start, m.start());
     colStringBuilder.append("'").append(field).append("'").append(symbol);
 
     start = m.end();
 }
 colStringBuilder.append("'").append(input.substring(start)).append("'");
 
 System.out.println(colStringBuilder.toString()); //'x'+'y'-'z'  

经过对 java 正则匹配的使用,感觉可以封装一个正则判断工具类,主要用于常见邮箱、手机等判断。

使用java正则包中的 Pattern 类封装的工具,主要实现了几个简单的匹配检查。

  • 是否正确邮箱地址判断
  • 是否正确url日志判断
  • 是否正确ip判断
  • 是否正整数判断
  • 是否11位手机号简单判断
  • 是否含有中文
  • 是否含有特殊字符判断
  • 是否正确身份证判断

使用举例

  import com.javabage.tools.utils. regex Utils;
 
 /**
  * @author liangxn
  * @date 2021-12-06
  */ public class  Regex UtilsTest {
 
     public  static   void  main(String[] args) {
         print("isEmail(\"abc12@qq.com\")", RegexUtils.isEmail("abc12@qq.com"));
         print("isEmail(\"abc12qq.com\")", RegexUtils.isEmail("abc12qq.com"));
 
         print("isURL(\"#34;)", RegexUtils.isURL("#34;));
         print("isURL(\"#34;)", RegexUtils.isURL("#34;));
         print("isURL(\"httpz://www.qq.com\")", RegexUtils.isURL("httpz://www.qq.com"));
 
         print("isIp(\"192.168.1.1\")", RegexUtils.isIp("192.168.1.1"));
         print("isIp(\"10.253.181.74\")", RegexUtils.isIp("10.253.181.74"));
         print("isIp(\" 127.0.0.1 \")", RegexUtils.isIp("127.0.0.1"));
         print("isIp(\"192.256.1.1\")", RegexUtils.isIp("192.256.1.1"));
 
         print("is number (\"fasdf\")", RegexUtils.isNumber("fasdf"));
         print("isNumber(\"12345\")", RegexUtils.isNumber("12345"));
 
         print("isMobile(\"2457894\")", RegexUtils.isMobile("2457894"));
         print("isMobile(\"12345678911\")", RegexUtils.isMobile("12345678911"));
 
         print("hasChinese(\"fsdf北京564\")", RegexUtils.hasChinese("fsdf北京564"));
         print("hasChinese(\"12345678911\")", RegexUtils.hasChinese("12345678911"));
 
         print("hasSpecialChar(\"245@7894\")", RegexUtils.hasSpecialChar("245@7894"));
         print("hasSpecialChar(\"fa34g-er\")", RegexUtils.hasSpecialChar("fa34g-er"));
 
         print("isIdCard(\"372522195710100019\")", RegexUtils.isIdCard("372522195710100019"));
         print("isIdCard(\"371521198411051558\")", RegexUtils.isIdCard("371521198411051558"));
     }
 
     public static void print(String desc, Object result) {
         System.out.println(desc + " => " + result);
     }
 }  

控制台内容:

  isEmail("abc12@qq.com") => true
 isEmail("abc12qq.com") => false
 isURL("#34;) => true
 isURL("#34;) => true
 isURL("httpz://www.qq.com") => false
 isIp("192.168.1.1") => true
 isIp("10.253.181.74") => true
 isIp("127.0.0.1") => true
 isIp("192.256.1.1") => false
 isNumber("fasdf") => false
 isNumber("12345") => true
 isMobile("2457894") => false
 isMobile("12345678911") => true
 hasChinese("fsdf北京564") => true
 hasChinese("12345678911") => false
 hasSpecialChar("245@7894") => true
 hasSpecialChar("fa34g-er") => false
 isIdCard("372522195710100019") => true
 isIdCard("371521198411051558") => false  

工具类源码:

  import com.google.common.base.Strings;
 
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 /**
  * java正则工具类,内置常用正则检查
  *
  * @author liangxn
  * @date 2021-12-06
  */ public class RegexUtils {
 
     /**
      * 判断是否是正确的邮箱地址
      *
      * @param email 邮箱
      * @return boolean 是否是邮箱,true是,false否
      */     public static boolean isEmail(String email) {
         if (Strings.isNullOrEmpty(email)) {
             return false;
         }
         return email.matches("\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*");
     }
 
     /**
      * 判断是否是url
      *
      * @param url url地址
      * @return boolean 是否是url地址,true是,false否
      */     public static boolean isURL(String url) {
         String regex = "(https?|ftp| file )://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]";
         return url.matches(regex);
     }
 
     /**
      * 判断是否是正确的IP地址
      *
      * @param ip ip地址
      * @return boolean 是否是IP地址,true是,false否
      */     public static boolean isIp(String ip) {
         if (Strings.isNullOrEmpty(ip)) {
             return false;
         }
         String regex = "^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\."
             + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
             + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
             + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$";
         return ip.matches(regex);
     }
 
     /**
      * 判断是否正整数
      *
      * @param number 数字字符串
      * @return boolean 是否是正整数,true是,false否
      */     public static boolean isNumber(String number) {
         if (Strings.isNullOrEmpty(number)) {
             return false;
         }
         return number.matches("[0-9]*");
     }
 
     /**
      * 简单判断是否是11位手机号码
      *
      * @param mobile 手机号
      * @return boolean 是否11位手机号,true是,false否
      */     public static boolean isMobile(String mobile) {
         if (Strings.isNullOrEmpty(mobile)) {
             return false;
         }
         return mobile.matches("^1\\d{10}$");
     }
 
     /**
      * 判断是否含有中文,仅适合中国汉字,不包括标点
      *
      * @param text
      * @return boolean 是否含有中文,true是,false否
      */     public static boolean hasChinese(String text) {
         if (Strings.isNullOrEmpty(text)) {
             return false;
         }
         Pattern p = Pattern.compile("[\u4e00-\u9fa5]");
         Matcher m = p.matcher(text);
         return m.find();
     }
 
     /**
      * 判断是否含有特殊字符
      *
      * @param text 检查文本
      * @return boolean 是否含有特殊字符,true是,false否
      */     public static boolean hasSpecialChar(String text) {
         if (Strings.isNullOrEmpty(text)) {
             return false;
         }
         // 除a-zA-Z0-9、中划线-、下划线_、空格、制表符、换页符等之外的字符
         return text. replace All("[a-z]*[A-Z]*\\d*-*_*\\s*", "").length() != 0;
     }
 
     /**
      * 判断是否身份证号
      *
      * @param id 身份证号
      * @return boolean 是否正常身份证号,true是,false否
      */     public static boolean isIdCard(String id) {
         if (Strings.isNullOrEmpty(id)) {
             return false;
         }
         // 定义判别用户身份证号的正则表达式(15位或者18位,最后一位可以为字母)
         String regular Expression  = "(^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)" +
             "\\d{3}[0-9Xx]$)|" +
             "(^[1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}$)";
         //假设18位身份证号码:41000119910101123X  410001 19910101 123X
         //^开头
         //[1-9] 第一位1-9中的一个      4
         //\\d{5} 五位数字           10001(前六位省市县地区)
         //(18|19|20)                19(现阶段可能取值范围18xx-20xx年)
         //\\d{2}                    91(年份)
         //((0[1-9])|(10|11|12))     01(月份)
         //(([0-2][1-9])|10|20|30|31)01(日期)
         //\\d{3} 三位数字            123(第十七位奇数代表男,偶数代表女)
         //[0-9Xx] 0123456789Xx其中的一个 X(第十八位为校验值)
         //$结尾
 
         //假设15位身份证号码:410001910101123  410001 910101 123
         //^开头
         //[1-9] 第一位1-9中的一个      4
         //\\d{5} 五位数字           10001(前六位省市县地区)
         //\\d{2}                    91(年份)
         //((0[1-9])|(10|11|12))     01(月份)
         //(([0-2][1-9])|10|20|30|31)01(日期)
         //\\d{3} 三位数字            123(第十五位奇数代表男,偶数代表女),15位身份证不含X
         //$结尾
 
         boolean matches = id.matches(regularExpression);
 
         //判断第18位校验值
         if (matches) {
             if (id.length() == 18) {
                 try {
                     char[] charArray = id.toCharArray();
                     //前十七位加权因子
                     int[] idCardWi = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
                     //这是除以11后,可能产生的11位余数对应的验证码
                     String[] idCardY = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};
                     int sum = 0;
                     for (int i = 0; i < idCardWi.length; i++) {
                         int current = Integer.parseInt(String.valueOf(charArray[i]));
                         int count = current * idCardWi[i];
                         sum += count;
                     }
                     char idCardLast = charArray[17];
                     int idCardMod = sum % 11;
 
                     return idCardY[idCardMod].equals(String.valueOf(idCardLast));
                 } catch ( Exception  e) {
                     e.printStackTrace();
                     return false;
                 }
             }
         }
         return matches;
     }
 }  

依赖包

  <dependency>
     <groupId>com.google.guava</groupId>
     <artifactId>guava</artifactId>
     <version>20.0</version>
     <scope>compile</scope>
 </dependency>  

鄙人编码十年多,在项目中也积累了一些工具类,很多工具类在每个项目都有在用,很实用。大部分是鄙人封装的,有些工具类是同事封装的,有些工具类已经不记得是ctrl+c的还是自己封装的了,现在有空就会总结项目中大部分的工具类,分享给各位码友。如果文章中涉及的代码有侵权行为请通知鄙人处理。

计划是先把工具类整理出来,正所谓工欲善其事,必先利其器。项目中不管是普通单体项目还是多模块 maven 项目或是分布式微服务,一部分功能模块都是可以重用的,工具类模块就是其中之一。

文章来源:智云一二三科技

文章标题:「Java工具类」Java正则匹配工具类RegexUtils

文章地址:https://www.zhihuclub.com/182733.shtml

关于作者: 智云科技

热门文章

网站地图