package com.jingewenku.abrahamcaijin.commonutil; import android.annotation.SuppressLint; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.Hashtable; import java.util.regex.Pattern; /** * 主要功能: 用于App验证数据验证 * * @Prject: CommonUtilLibrary * @Package: com.jingewenku.abrahamcaijin.commonutil * @author: AbrahamCaiJin * @date: 2017年05月03日 16:37 * @Copyright: 个人版权所有 * @Company: * @version: 1.0.0 */ @SuppressLint("SimpleDateFormat") @SuppressWarnings("rawtypes") public class AppValidationMgr { //邮箱表达式 private final static Pattern email_pattern = Pattern.compile("^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$"); //手机号表达式 private final static Pattern phone_pattern = Pattern.compile("^(13|15|18)\\d{9}$"); //银行卡号表达式 private final static Pattern bankNo_pattern = Pattern.compile("^[0-9]{16,19}$"); //座机号码表达式 private final static Pattern plane_pattern = Pattern.compile("^((\\(\\d{2,3}\\))|(\\d{3}\\-))?(\\(0\\d{2,3}\\)|0\\d{2,3}-)?[1-9]\\d{6,7}(\\-\\d{1,4})?$"); //非零表达式 private final static Pattern notZero_pattern = Pattern.compile("^\\+?[1-9][0-9]*$"); //数字表达式 private final static Pattern number_pattern = Pattern.compile("^[0-9]*$"); //大写字母表达式 private final static Pattern upChar_pattern = Pattern.compile("^[A-Z]+$"); //小写字母表达式 private final static Pattern lowChar_pattern = Pattern.compile("^[a-z]+$"); //大小写字母表达式 private final static Pattern letter_pattern = Pattern.compile("^[A-Za-z]+$"); //中文汉字表达式 private final static Pattern chinese_pattern = Pattern.compile("^[\u4e00-\u9fa5],{0,}$"); //条形码表达式 private final static Pattern onecode_pattern = Pattern.compile("^(([0-9])|([0-9])|([0-9]))\\d{10}$"); //邮政编码表达式 private final static Pattern postalcode_pattern = Pattern.compile("([0-9]{3})+.([0-9]{4})+"); //IP地址表达式 private final static Pattern ipaddress_pattern = Pattern.compile("[1-9](\\d{1,2})?\\.(0|([1-9](\\d{1,2})?))\\.(0|([1-9](\\d{1,2})?))\\.(0|([1-9](\\d{1,2})?))"); //URL地址表达式 private final static Pattern url_pattern = Pattern.compile("(https?://(w{3}\\.)?)?\\w+\\.\\w+(\\.[a-zA-Z]+)*(:\\d{1,5})?(/\\w*)*(\\??(.+=.*)?(&.+=.*)?)?"); //用户名表达式 private final static Pattern username_pattern = Pattern.compile("^[A-Za-z0-9_]{1}[A-Za-z0-9_.-]{3,31}"); //真实姓名表达式 private final static Pattern realnem_pattern = Pattern.compile("[\u4E00-\u9FA5]{2,5}(?:·[\u4E00-\u9FA5]{2,5})*"); //匹配HTML标签,通过下面的表达式可以匹配出HTML中的标签属性。 private final static Pattern html_patter = Pattern.compile("<\\\\/?\\\\w+((\\\\s+\\\\w+(\\\\s*=\\\\s*(?:\".*?\"|'.*?'|[\\\\^'\">\\\\s]+))?)+\\\\s*|\\\\s*)\\\\/?>"); //抽取注释,如果你需要移除HMTL中的注释,可以使用如下的表达式。 private final static Pattern notes_patter = Pattern.compile("<!--(.*?)-->"); //查找CSS属性,通过下面的表达式,可以搜索到相匹配的CSS属性。 private final static Pattern css_patter = Pattern.compile("^\\\\s*[a-zA-Z\\\\-]+\\\\s*[:]{1}\\\\s[a-zA-Z0-9\\\\s.#]+[;]{1}"); //提取页面超链接,提取html中的超链接。 private final static Pattern hyperlink_patter = Pattern.compile("(<a\\\\s*(?!.*\\\\brel=)[^>]*)(href=\"https?:\\\\/\\\\/)((?!(?:(?:www\\\\.)?'.implode('|(?:www\\\\.)?', $follow_list).'))[^\"]+)\"((?!.*\\\\brel=)[^>]*)(?:[^>]*)>"); //提取网页图片,假若你想提取网页中所有图片信息,可以利用下面的表达式。 private final static Pattern image_patter = Pattern.compile("\\\\< *[img][^\\\\\\\\>]*[src] *= *[\\\\\"\\\\']{0,1}([^\\\\\"\\\\'\\\\ >]*)"); //提取Color Hex Codes,有时需要抽取网页中的颜色代码,可以使用下面的表达式。 private final static Pattern color_patter = Pattern.compile("^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$"); //文件路径及扩展名校验,验证windows下文件路径和扩展名(下面的例子中为.txt文件) private final static Pattern route_patter = Pattern.compile("^([a-zA-Z]\\\\:|\\\\\\\\)\\\\\\\\([^\\\\\\\\]+\\\\\\\\)*[^\\\\/:*?\"<>|]+\\\\.txt(l)?$"); //提取URL链接,下面的这个表达式可以筛选出一段文本中的URL // ^(f|ht){1}(tp|tps):\\/\\/([\\w-]+\\.)+[\\w-]+(\\/[\\w- ./?%&=]*)? //检查URL的前缀,应用开发中很多时候需要区分请求是HTTPS还是HTTP,通过下面的表达式可以取出一个url的前缀然后再逻辑判断。 //if (!s.match(/^[a-zA-Z]+:\\/\\//)) // { // s = 'http://' + s; // } //校验IP-v6地址 // (([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])) //校验IP-v4地址 // \\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b // 判断IE的版本 // ^.*MSIE [5-8](?:\\.[0-9]+)?(?!.*Trident\\/[5-9]\\.0).*$ // 校验金额 //^[0-9]+(.[0-9]{2})?$ // 校验密码强度 //^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$ /** * 验证是否为空串 (包括空格、制表符、回车符、换行符组成的字符串 若输入字符串为null或空字符串,返回true) * @param str 验证字符 * @return boolean */ public static boolean isEmpty(String str) { if (str == null || "".equals(str) || str.length() == 0) { return true; } for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); if (c != ' ' && c != '\t' && c != '\r' && c != '\n') { return false; } } return true; } /** * 是否不为空 * @param s */ public static boolean isNotEmpty(String s){ return s != null && !"".equals(s.trim()); } /** * 验证非零正整数 * @param str 验证字符 * @return boolean */ public static boolean isNotZero(String str) { return notZero_pattern.matcher(str).matches(); } /** * 验证是数字 * @param str 验证字符 * @return boolean */ public static boolean isNumber(String str) { return number_pattern.matcher(str).matches(); } /** * 验证是大写字母 * @param str 验证字符 * @return boolean */ public static boolean isUpChar(String str) { return upChar_pattern.matcher(str).matches(); } /** * 验证是小写字母 * @param str 验证字符 * @return boolean */ public static boolean isLowChar(String str) { return lowChar_pattern.matcher(str).matches(); } /** * 验证是英文字母 * @param str 验证字符 * @return boolean */ public static boolean isLetter(String str) { return letter_pattern.matcher(str).matches(); } /** * 验证输入汉字 * @param str 验证字符 * @return boolean */ public static boolean isChinese(String str) { return chinese_pattern.matcher(str).matches(); } /** * 验证真实姓名 * @param str 验证字符 * @return */ public static boolean isRealName(String str){ return realnem_pattern.matcher(str).matches(); } /** * 验证是否是条形码 * @param oneCode 条形码 * @return boolean */ public static boolean isOneCode(String oneCode) { return onecode_pattern.matcher(oneCode).matches(); } /** * 验证邮箱是否正确 * @param email 邮箱地址 * @return boolean */ public static boolean isEmail(String email) { return email_pattern.matcher(email).matches(); } /** * 验证手机号是否正确 * @param phone 手机号码 * @return boolean */ public static boolean isPhone(String phone) { return phone_pattern.matcher(phone).matches(); } /** * 验证座机号码是否正确 * @param plane 座机号码 * @return boolean */ public static boolean isPlane(String plane) { return plane_pattern.matcher(plane).matches(); } /** * 验证邮政编码是否正确 * @param postalcode 邮政编码 * @return boolean */ public static boolean isPostalCode(String postalcode) { return postalcode_pattern.matcher(postalcode).matches(); } /** * 验证IP地址是否正确 * @param ipaddress IP地址 * @return boolean */ public static boolean isIpAddress(String ipaddress){ return ipaddress_pattern.matcher(ipaddress).matches(); } /** * 验证URL地址是否正确 * @param url 地址 * @return boolean */ public static boolean isURL(String url){ return url_pattern.matcher(url).matches(); } /** * 验证是否是正整数 * @param str 验证字符 * @return boolean */ public static boolean isInteger(String str){ try{ Integer.valueOf(str); return true; }catch(Exception e){ return false; } } /** * 验证是否是小数 * @param paramString 验证字符 * @return boolean */ public static boolean isPoint(String paramString){ if(paramString.indexOf(".") > 0){ if(paramString.substring(paramString.indexOf(".")).length() > 3){ return false; } } return true; } /** * 验证是否银行卡号 * @param bankNo 银行卡号 * @return */ public static boolean isBankNo(String bankNo){ //替换空格 bankNo = bankNo.replaceAll(" ", ""); //银行卡号可为12位数字 if(12 == bankNo.length()){ return true; } //银行卡号可为16-19位数字 return bankNo_pattern.matcher(bankNo).matches(); } /** * 验证身份证号码是否正确 * @param IDCardNo 身份证号码 * @return boolean */ public static boolean isIDCard(String IDCardNo) { //记录错误信息 String errmsg = ""; String[] ValCodeArr = { "1", "0", "x", "9", "8", "7", "6", "5", "4", "3", "2" }; String[] Wi = { "7", "9", "10", "5", "8", "4", "2", "1", "6", "3", "7","9", "10", "5", "8", "4", "2" }; String Ai = ""; //================ 身份证号码的长度 15位或18位 ================ if (IDCardNo.length() != 15 && IDCardNo.length() != 18) { errmsg = "身份证号码长度应该为15位或18位!"; AppLogMessageMgr.e("AppValidationMgr-->>isIDCard", errmsg); return false; } //================ 数字 除最后以为都为数字 ================ if (IDCardNo.length() == 18) { Ai = IDCardNo.substring(0, 17); } else if (IDCardNo.length() == 15) { Ai = IDCardNo.substring(0, 6) + "19" + IDCardNo.substring(6, 15); } if (isNumber(Ai) == false) { errmsg = "身份证15位号码都应为数字 ; 18位号码除最后一位外,都应为数字"; AppLogMessageMgr.e("AppValidationMgr-->>isIDCard", errmsg); return false; } //================ 出生年月是否有效 ================ //年份 String strYear = Ai.substring(6, 10); //月份 String strMonth = Ai.substring(10, 12); //日 String strDay = Ai.substring(12, 14); if (AppSysDateMgr.getDateIsTrue(strYear, strMonth, strDay) == false) { errmsg = "身份证生日无效"; AppLogMessageMgr.e("AppValidationMgr-->>isIDCard", errmsg); return false; } GregorianCalendar gc = new GregorianCalendar(); SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd"); try { if ((gc.get(Calendar.YEAR) - Integer.parseInt(strYear)) > 150 || (gc.getTime().getTime() - s.parse(strYear + "-" + strMonth + "-" + strDay).getTime()) < 0) { errmsg = "身份证生日不在有效范围"; AppLogMessageMgr.e("AppValidationMgr-->>isIDCard", errmsg); return false; } } catch (NumberFormatException e) { e.printStackTrace(); errmsg = "身份证生日不在有效范围"; AppLogMessageMgr.e("AppValidationMgr-->>isIDCard", errmsg + e.getMessage()); return false; } catch (java.text.ParseException e1) { e1.printStackTrace(); errmsg = "身份证生日不在有效范围"; AppLogMessageMgr.e("AppValidationMgr-->>isIDCard", errmsg + e1.getMessage()); return false; } if (Integer.parseInt(strMonth) > 12 || Integer.parseInt(strMonth) == 0) { errmsg = "身份证月份无效"; AppLogMessageMgr.e("AppValidationMgr-->>isIDCard", errmsg); return false; } if (Integer.parseInt(strDay) > 31 || Integer.parseInt(strDay) == 0) { errmsg = "身份证日期无效"; AppLogMessageMgr.e("AppValidationMgr-->>isIDCard", errmsg); return false; } //================ 地区码时候有效 ================ Hashtable hashtable = AppInfoMgr.getAreaCodeAll(); if (hashtable.get(Ai.substring(0, 2)) == null) { errmsg = "身份证地区编码错误"; AppLogMessageMgr.e("AppValidationMgr-->>isIDCard", errmsg); return false; } //================ 判断最后一位的值 ================ int TotalmulAiWi = 0; for (int i = 0; i < 17; i++) { TotalmulAiWi = TotalmulAiWi+ Integer.parseInt(String.valueOf(Ai.charAt(i))) * Integer.parseInt(Wi[i]); } int modValue = TotalmulAiWi % 11; String strVerifyCode = ValCodeArr[modValue]; Ai = Ai + strVerifyCode; if (IDCardNo.length() == 18) { if (Ai.equals(IDCardNo) == false) { errmsg = "身份证无效,不是合法的身份证号码"; AppLogMessageMgr.e("AppValidationMgr-->>isIDCard", errmsg); return false; } } else { return true; } return true; } /** * 判断是否有特殊字符 * @param str 验证字符 * @return boolean */ public static boolean isPeculiarStr(String str){ boolean flag = false; String regEx = "[^0-9a-zA-Z\u4e00-\u9fa5]+"; if(str.length() != (str.replaceAll(regEx, "").length())) { flag = true; } return flag; } /** * 判断是否为用户名账号(规则如下:用户名由下划线或字母开头,由数字、字母、下划线、点、减号组成的4-32位字符) * @param username 用户名 * @return boolean */ public static boolean isUserName(String username) { return username_pattern.matcher(username).matches(); } }