package com.youth.xframe.utils; import java.util.regex.Pattern; /** * 正则工具类 * 验证邮箱、手机号、电话号码、身份证号码、银行卡卡号、IP、邮政编码、车牌号等 */ public class XRegexUtils { private XRegexUtils() { throw new UnsupportedOperationException("u can't instantiate me..."); } /** * 手机号码,中间4位星号替换 * * @param phone 手机号 * @return 星号替换的手机号 */ public static String phoneNoHide(String phone) { // 括号表示组,被替换的部分$n表示第n组的内容 // 正则表达式中,替换字符串,括号的意思是分组,在replace()方法中, // 参数二中可以使用$n(n为数字)来依次引用模式串中用括号定义的字串。 // "(\d{3})\d{4}(\d{4})", "$1****$2"的这个意思就是用括号, // 分为(前3个数字)中间4个数字(最后4个数字)替换为(第一组数值,保持不变$1)(中间为*)(第二组数值,保持不变$2) return phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2"); } /** * 银行卡号,保留最后4位,其他星号替换 * * @param cardId 卡号 * @return 星号替换的银行卡号 */ public static String cardIdHide(String cardId) { return cardId.replaceAll("\\d{15}(\\d{3})", "**** **** **** **** $1"); } /** * 身份证号,中间10位星号替换 * * @param id 身份证号 * @return 星号替换的身份证号 */ public static String idHide(String id) { return id.replaceAll("(\\d{4})\\d{10}(\\d{4})", "$1** **** ****$2"); } /** * 简单验证用户名(字母、数字、下划线) * * @param username 用户名 * @return 是否为用户名 */ public static boolean checkUserName(String username) { Pattern pattern = Pattern.compile("^\\w+$"); return pattern.matcher(username).find(); } /** * 简单验证昵称(字母、数字、汉字、下划线) * * @param nickname 昵称 * @return 是否为昵称 */ public static boolean checkNickName(String nickname) { Pattern pattern = Pattern.compile("\\w\\u4e00-\\u9fa5]+"); return pattern.matcher(nickname).find(); } /** * 简单验证密码(6-16位、字母、数字、字符) * * @param password 密码 * @return 是否为密码 */ public static boolean checkPassword(String password) { Pattern pattern = Pattern.compile("^(\\w|[`~!@#$%^&*()+=|{}':;',\\\\\\\\[\\\\\\\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?]){6,16}$"); return pattern.matcher(password).find(); } /** * 是否为车牌号(川A88888) * * @param vehicleNo 车牌号 * @return 是否为车牌号 */ public static boolean checkVehicleNo(String vehicleNo) { Pattern pattern = Pattern.compile("^[\u4e00-\u9fa5]{1}[a-zA-Z]{1}[a-zA-Z_0-9]{5}$"); return pattern.matcher(vehicleNo).find(); } /** * 验证身份证号码 * * @param idCard 居民身份证号码15位或18位,最后一位可能是数字或字母 * @return 验证成功返回true,验证失败返回false */ public static boolean checkIdCard(String idCard) { // 简单验证/^(\d{15}$|^\d{18}$|^\d{17}(\d|X|x))$/ String regex = "(^[1-9]\\d{5}(18|19|([23]\\d))\\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{2}$)"; return Pattern.matches(regex, idCard); } /** * 验证手机号码(支持国际格式,+86135xxxx...(中国内地),+00852137xxxx...(中国香港)) * * @param mobile 移动、联通、电信运营商的号码段 * <p>移动的号段:134(0-8)、135、136、137、138、139、147、150、151、152、157、158、159、187、188</p> * <p>联通的号段:130、131、132、155、156、185、186</p> * <p>电信的号段:133、153、180、189</p> * @return 验证成功返回true,验证失败返回false */ public static boolean checkMobile(String mobile) { String regex = "(\\+\\d+)?1[3458]\\d{9}$"; return Pattern.matches(regex, mobile); } /** * 验证固定电话号码 * * @param phone 电话号码,格式:国家(地区)电话代码 + 区号(城市代码) + 电话号码,如:+8602085588447 * <p><b>国家(地区) 代码 :</b>标识电话号码的国家(地区)的标准国家(地区)代码。它包含从 0 到 9 的一位或多位数字, * 数字之后是空格分隔的国家(地区)代码。</p> * <p><b>区号(城市代码):</b>这可能包含一个或多个从 0 到 9 的数字,地区或城市代码放在圆括号—— * 对不使用地区或城市代码的国家(地区),则省略该组件。</p> * <p><b>电话号码:</b>这包含从 0 到 9 的一个或多个数字 </p> * @return 验证成功返回true,验证失败返回false */ public static boolean checkPhone(String phone) { String regex = "(\\+\\d+)?(\\d{3,4}\\-?)?\\d{7,8}$"; return Pattern.matches(regex, phone); } /** * 验证Email * * @param email email地址,格式:zhangsan@sina.com,zhangsan@xxx.com.cn,xxx代表邮件服务商 * @return 验证成功返回true,验证失败返回false */ public static boolean checkEmail(String email) { String regex = "\\w+@\\w+\\.[a-z]+(\\.[a-z]+)?"; return Pattern.matches(regex, email); } /** * 验证整数(正整数和负整数) * * @param digit 一位或多位0-9之间的整数 * @return 验证成功返回true,验证失败返回false */ public static boolean checkDigit(String digit) { String regex = "\\-?[1-9]\\d+"; return Pattern.matches(regex, digit); } /** * 验证整数和浮点数(正负整数和正负浮点数) * * @param decimals 一位或多位0-9之间的浮点数,如:1.23,233.30 * @return 验证成功返回true,验证失败返回false */ public static boolean checkDecimals(String decimals) { String regex = "\\-?[1-9]\\d+(\\.\\d+)?"; return Pattern.matches(regex, decimals); } /** * 验证空白字符 * * @param blankSpace 空白字符,包括:空格、\t、\n、\r、\f、\x0B * @return 验证成功返回true,验证失败返回false */ public static boolean checkBlankSpace(String blankSpace) { String regex = "\\s+"; return Pattern.matches(regex, blankSpace); } /** * 验证中文 * * @param chinese 中文字符 * @return 验证成功返回true,验证失败返回false */ public static boolean checkChinese(String chinese) { String regex = "^[\u4E00-\u9FA5]+$"; return Pattern.matches(regex, chinese); } /** * 验证日期(年月日) * * @param birthday 日期,格式:1992-09-03,或1992.09.03 * @return 验证成功返回true,验证失败返回false */ public static boolean checkBirthday(String birthday) { String regex = "[1-9]{4}([-./])\\d{1,2}\\1\\d{1,2}"; return Pattern.matches(regex, birthday); } /** * 验证URL地址 * * @param url 格式:http://blog.csdn.net:80/xyang81/article/details/7705960? 或 http://www.csdn.net:80 * @return 验证成功返回true,验证失败返回false */ public static boolean checkURL(String url) { String regex = "(https?://(w{3}\\.)?)?\\w+\\.\\w+(\\.[a-zA-Z]+)*(:\\d{1,5})?(/\\w*)*(\\??(.+=.*)?(&.+=.*)?)?"; return Pattern.matches(regex, url); } /** * 匹配中国邮政编码 * * @param postcode 邮政编码 * @return 验证成功返回true,验证失败返回false */ public static boolean checkPostcode(String postcode) { String regex = "[1-9]\\d{5}"; return Pattern.matches(regex, postcode); } /** * 匹配IP地址(简单匹配,格式,如:192.168.1.1,127.0.0.1,没有匹配IP段的大小) * * @param ipAddress IPv4标准地址 * @return 验证成功返回true,验证失败返回false */ public static boolean checkIpAddress(String ipAddress) { String regex = "[1-9](\\d{1,2})?\\.(0|([1-9](\\d{1,2})?))\\.(0|([1-9](\\d{1,2})?))\\.(0|([1-9](\\d{1,2})?))"; return Pattern.matches(regex, ipAddress); } /** * 校验银行卡卡号 * * @param cardId 卡号 * @return 是否有效卡号 */ public static boolean checkBankCard(String cardId) { char bit = getBankCardCheckCode(cardId .substring(0, cardId.length() - 1)); return bit != 'N' && cardId.charAt(cardId.length() - 1) == bit; } /** * 从不含校验位的银行卡卡号采用 Luhm 校验算法获得校验位 * * @param nonCheckCodeCardId 不含校验位的银行卡 * @return 校验结果 */ public static char getBankCardCheckCode(String nonCheckCodeCardId) { if (nonCheckCodeCardId == null || nonCheckCodeCardId.trim().length() == 0 || !nonCheckCodeCardId.matches("\\d+")) { // 如果传的不是数据返回N return 'N'; } char[] chs = nonCheckCodeCardId.trim().toCharArray(); int luhmSum = 0; for (int i = chs.length - 1, j = 0; i >= 0; i--, j++) { int k = chs[i] - '0'; if (j % 2 == 0) { k *= 2; k = k / 10 + k % 10; } luhmSum += k; } return (luhmSum % 10 == 0) ? '0' : (char) ((10 - luhmSum % 10) + '0'); } }