package com.trade.common.utils;

import java.util.regex.Pattern;

/**
 * @description: 正则表达式工具类
 * @Author: wl
 * @Date: 2024/05/13
 * @Version: 1.0
 */
public class RegexpUtil {

    /**
     * 正浮点数
     */
    private static Pattern parameter = Pattern
            .compile("^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$");
    /**
     * 手机号验证
     */
    private static Pattern patternPhone = Pattern
            .compile("^(((13[0-9]{1})|(15[0-9]{1})|(18[0-9]{1})|(17[0-9]{1}))+\\d{8})?$");
    /**
     * 简单手机号验证(11位数字, 1开头)/^1\d{10}$/
     */
    private static Pattern patternPhoneSimple = Pattern.compile("^1\\d{10}$");
    /**
     * 身份证号验证
     */
    private static Pattern patternCardNo = Pattern.compile("(\\d{14}[0-9a-zA-Z])|(\\d{17}[0-9a-zA-Z])");
    /**
     * 邮箱验证
     */
    // "\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*"
    private static Pattern patternEmail = Pattern.compile("\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.(com|cn|net)");
    /**
     * 电子邮箱格式的定义(极其通用)：登录名@主机名.域名
     */
    private static Pattern patternCommonEmail = Pattern.compile("^([\\S]+@)([\\S]+[\\.])[\\S]+$");
    /**
     * 暂定邮编验证，目前只匹配字母和数字
     */
    private static Pattern patternTempPostCode = Pattern.compile("^[0-9a-zA-Z]+$");
    /**
     * 金额验证
     */
    private static Pattern patternMoney = Pattern.compile("^(([1-9]{1}\\d*)|([0]{1}))(\\.(\\d){0,2})?$");
    /**
     * 整数验证
     */
    private static Pattern patternInteger = Pattern.compile("^[-\\+]?[\\d]*$");
    /**
     * 网址
     */
    private static Pattern patternUrl = Pattern
            .compile("^([hH][tT]{2}[pP]://|[hH][tT]{2}[pP][sS]://)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~\\/])+$");
    /**
     * 座机
     */
    private static Pattern patternMobile = Pattern
            .compile("(?:(\\(\\+?86\\))(0[0-9]{2,3}\\-?)?([2-9][0-9]{6,7})+(\\-[0-9]{1,4})?)|"
                    + "(?:(86-?)?(0[0-9]{2,3}\\-?)?([2-9][0-9]{6,7})+(\\-[0-9]{1,4})?)");
    /**
     * 国内外，座机、手机，暂时先只考虑能输入数字，-，（），()
     */
    private static Pattern patternTempMobile = Pattern.compile("^[0-9\\(\\)\\（\\）\\-]+$");
    /**
     * 个人类型的手机号，只匹配数字和-
     */
    private static Pattern patternTempPersonMobile = Pattern.compile("^[0-9\\-]+$");
    /**
     * 用户名: 由字母数字下划线组成且开头必须是字母，不能超过16位
     */
    private static Pattern patternName = Pattern.compile("[a-zA-Z]{1}[a-zA-Z0-9_]{1,15}");
    /**
     * 密码：字母和数字构成，不能小于6位超过16位
     */
    private static Pattern patternPass = Pattern.compile("[a-zA-Z0-9]{6,16}");
    /** 中国香港身份证号格式 */
    private static Pattern patternHKCardNo = Pattern.compile("^[A-Z]{1,2}[0-9]{6}\\(?[0-9A]\\)?$");
    private static String ip = "^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\."
            + "(00?\\d|1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
            + "(00?\\d|1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\." + "(00?\\d|1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$";
    private static Pattern patternIp = Pattern.compile(ip);
    /**
     * 开户行，户名，银行名称格式。字母，中文,空格-,逗号，以及中英文的括号，但是不支持首尾空格
     */
    // ^[\\u4e00-\\u9fa5\\u0020a-zA-Z]+$
    private static Pattern patternBankAbout = Pattern
            .compile("^[\\u4e00-\\u9fa5a-zA-Z\\-\\,\\，\\(\\)\\（\\）]+(\\s+[\\u4e00-\\u9fa5a-zA-Z\\-\\,\\，]+)*$");
    /**
     * 非负整数格式
     */
    private static Pattern patternNonNegativeInteger = Pattern.compile("^[1-9]\\d*|0$");
    /**
     * 数字，字母
     */
    private static Pattern patternNumLetter = Pattern.compile("^[a-zA-Z0-9]+$");
    /**
     * 汉字，字母，-，空格，但是不支持首尾空格
     */
    private static Pattern patternTempName = Pattern
            .compile("^[\\u4e00-\\u9fa5a-zA-Z\\-]+(\\s+[\\u4e00-\\u9fa5a-zA-Z\\-]+)*$");

    /**
     * ip格式验证
     */
    public static boolean checkIp(String ip) {
        return patternIp.matcher(ip).matches();
    }

    /**
     * 网址格式验证
     */
    public static boolean checkUrl(String url) {
        return patternUrl.matcher(url).matches();
    }

    /**
     * 座机格式验证
     */
    public static boolean checkMobile(String mobile) {
        return patternMobile.matcher(mobile).matches();
    }

    /**
     * 暂定的企业联系号码验证
     */
    public static boolean checkTempMobile(String mobile) {
        return patternTempMobile.matcher(mobile).matches();
    }

    /**
     * 手机号码格式验证
     *
     * @param phone
     * @return
     */
    public static boolean checkPhone(String phone) {
        return patternPhone.matcher(phone).matches();
    }

    /**
     * 手机号码简单的格式验证
     *
     * @param phone
     * @return
     */
    public static boolean checkPhoneSimple(String phone) {
        return patternPhoneSimple.matcher(phone).matches();
    }

    /**
     * 身份证格式验证
     *
     * @param cardNo
     * @return
     */
    public static boolean checkCardNo(String cardNo) {
        return patternCardNo.matcher(cardNo).matches();
    }

    /**
     * 中国香港身份证号码格式验证
     * 
     * @param cardNo
     * @return
     */
    public static boolean checkHKCardNo(String cardNo) {
        return patternHKCardNo.matcher(cardNo).matches();
    }

    /**
     * 正浮点数验证
     */
    public static boolean checkIntDouble(String str) {
        return parameter.matcher(str).matches();
    }

    /**
     * 邮箱验证
     */
    public static boolean checkEmail(String email) {
        return patternEmail.matcher(email).matches();
    }

    /**
     * 通用邮箱验证
     */
    public static boolean checkCommonEmail(String email) {
        return patternCommonEmail.matcher(email).matches();
    }

    /**
     * 暂定邮编验证
     */
    public static boolean checkTempPostCode(String postCode) {
        return patternTempPostCode.matcher(postCode).matches();
    }

    /**
     * 金额格式验证
     *
     * @param money
     * @return
     */
    public static boolean checkMoney(String money) {
        return patternMoney.matcher(money).matches();
    }

    /**
     * 整数验证
     */
    public static boolean checkInt(String str) {
        return patternInteger.matcher(str).matches();
    }

    /**
     * 用户名验证
     */
    public static boolean checkName(String name) {
        return patternName.matcher(name).matches();
    }

    /**
     * 密码验证
     */
    public static boolean checkPass(String pass) {
        return patternPass.matcher(pass).matches();
    }

    /**
     * 银行卡开户名称，银行名称等相关验证
     */
    public static boolean checkBankAbout(String bankAbout) {
        return patternBankAbout.matcher(bankAbout).matches();
    }

    /**
     * 非负整数验证
     */
    public static boolean checkNonNegativeInteger(String str) {
        return patternNonNegativeInteger.matcher(str).matches();
    }

    /**
     * 个人类型手机号简单验证
     */
    public static boolean checkTempPersonMobile(String mobile) {
        return patternTempPersonMobile.matcher(mobile).matches();
    }

    /**
     * 验证数字和字母
     */
    public static boolean checkNumAndLetter(String str) {
        return patternNumLetter.matcher(str).matches();
    }

    /**
     * 验证字母，汉字，-，空格。首尾不包括空格
     */
    public static boolean checkTempName(String str) {
        return patternTempName.matcher(str).matches();
    }
}
