介绍语
本号主要是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 项目或是分布式微服务,一部分功能模块都是可以重用的,工具类模块就是其中之一。