前言:
如今兄弟们对“java字符正则匹配”可能比较看重,我们都需要分析一些“java字符正则匹配”的相关知识。那么小编同时在网上收集了一些关于“java字符正则匹配””的相关资讯,希望小伙伴们能喜欢,姐妹们快快来学习一下吧!介绍语
本号主要是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.RegexUtils; /** * @author liangxn * @date 2021-12-06 */ public class RegexUtilsTest { 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(\"\")", RegexUtils.isURL(";)); print("isURL(\"\")", RegexUtils.isURL(";)); print("isURL(\"httpz://\")", RegexUtils.isURL("httpz://;)); 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("isNumber(\"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(";) => true isURL(";) => true isURL("httpz://;) => 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.replaceAll("[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 regularExpression = "(^[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字符正则匹配