package com.opslab.util;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
* Description:
* 封装一些正则相关的操作
*/
public final class RegUtil {

/**
* Alphanumeric characters
*/
public static final String REG_ALNUM = "\\p{Alnum}";
/**
* Alphabetic characters
*/
public static final String REG_ALPHA = "\\p{Alpha}";
/**
* ASCII characters
*/
public static final String REG_ASCII = "\\p{ASCII}";
/**
* Space and tab
*/
public static final String REG_BLANK = "\\p{Blank}";
/**
* Control characters
*/
public static final String REG_CNTRL = "\\p{Cntrl}";
/**
* Digits
*/
public static final String REG_DIGITS = "\\p{Digit}";
/**
* SVisible characters (i.e. anything except spaces, control characters, etc.)
*/
public static final String REG_GRAPH = "\\p{Graph}";
/**
* Lowercase letters
*/
public static final String REG_LOWER = "\\p{Lower}";
/**
* Visible characters and spaces (i.e. anything except control characters, etc.)
*/
public static final String REG_PRINT = "\\p{Print}";
/**
* Punctuation and symbols.
*/
public static final String REG_PUNCT = "\\p{Punct}";
/**
* All whitespace characters, including line breaks
*/
public static final String REG_SPACE = "\\p{Space}";
/**
* Uppercase letters
*/
public static final String REG_UPPER = "\\p{Upper}";
/**
* Hexadecimal digits
*/
public static final String REG_XDIGIT = "\\p{XDigit}";
/**
* 空白行
*/
public static final String REG_SPACE_LINE = "\\n\\s*\\r";
/**
* 首尾空白字符
*/
public static final String REG_SPACE_POINT = "^\\s*|\\s*$";
/**
* HTML
*/
public static final String REG_HTML = "<(\\S*?)[^>]*>.*?</\\1>|<.*? />";
/**
* Email
*/
public static final String REG_EMAIL = "^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$";
/**
* 国内固定电话
*/
public static final String REG_FIXED_TELEPHONE = "\\d{3}-\\d{8}|\\d{4}-\\d{7}";
/**
* 邮政编码
*/
public static final String REG_POSTALCODE = "[1-9]\\d{5}(?!\\d)";
/**
* 身份证编码
*/
public static final String REG_IDENTIFICATION_CARD = "\\d{15}|\\d{18}";
/**
* URL地址
*/
public static final String REG_URL = "^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$";
/**
* 移动电话
*/
public static final String REG_MOBILE_TELEPHONE = "^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\\d{8}$";
/**
* 合法的名字(字母开头,允许5-16字节,允许字母数字下划线)
*/
public static final String REG_LEGAL_ACCOUNT = "^[a-zA-Z][a-zA-Z0-9_]{4,15}$";
/**
* i地址
*/
public static final String REG_IP = "((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)";
private static Pattern numericPattern = Pattern.compile("^[0-9\\-]+$");
private static Pattern numericStringPattern = Pattern.compile("^[0-9\\-\\-]+$");
private static Pattern floatNumericPattern = Pattern.compile("^[0-9\\-\\.]+$");
private static Pattern abcPattern = Pattern.compile("^[a-z|A-Z]+$");

/**
* 判断是否数字表示
*
* @param src 源字符串
* @return 是否数字的标志
*/
public final static boolean isNumeric(String src) {
boolean return_value = false;
if (src != null && src.length() > 0) {
Matcher m = numericPattern.matcher(src);
if (m.find()) {
return_value = true;
}
}
return return_value;
}

/**
* 判断是否纯字母组合
*
* @param src 源字符串
* @return 是否纯字母组合的标志
*/
public final static boolean isABC(String src) {
boolean return_value = false;
if (src != null && src.length() > 0) {
Matcher m = abcPattern.matcher(src);
if (m.find()) {
return_value = true;
}
}
return return_value;
}


/**
* 判断是否浮点数字表示
*
* @param src 源字符串
* @return 是否数字的标志
*/
public final static boolean isFloatNumeric(String src) {
boolean return_value = false;
if (src != null && src.length() > 0) {
Matcher m = floatNumericPattern.matcher(src);
if (m.find()) {
return_value = true;
}
}
return return_value;
}

/**
* 判断字符串str是否符合正则表达式reg
*
* @param str 需要处理的字符串
* @param reg 正则
* @return 是否匹配
*/
public final static boolean isMatche(String str, String reg) {
Pattern pattern = Pattern.compile(reg);
Matcher isNum = pattern.matcher(str);
return isNum.matches();
}

/**
* 获取符合reg正则表达式的字符串在String中出现的次数
*
* @param str 需要处理的字符串
* @param reg 正则
* @return 出现的次数
*/
public final static int countSubStrReg(String str, String reg) {
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher(str);
int i = 0;
while (m.find()) {
i++;
}
return i;
}


/**
* 判断是否是符合邮箱
*
* @param email 判断的字符串
* @return 是否是符合的邮箱
*/
public final static boolean isEmail(String email) {
if (email == null || email.length() < 1 || email.length() > 256) {
return false;
}
Pattern pattern = Pattern.compile(REG_EMAIL);
return pattern.matcher(email).matches();
}
}