一些过滤字符串的正则表达式

前言

工作中常用的一些字符串过滤

/**
 * 工具类,判断string是否合法
 */
public class StringUtil {
    /**
     * 手机号
     * 有个简单的:^(1)\\d{10}$
     */
    private static Pattern PATTERN_ISMOBILE = Pattern.compile("^((13[0-9])|(15[^4,\\D])|(147)|(18[0-9])|(17[0-9])|(16[0-9]))\\d{8}$");
    /**
     * 邮编
     */
    private static Pattern PATTERN_ZIP = Pattern.compile("^[1-9][0-9]{5}$");
    /**
     * 邮箱
     * 有个简单的:\\w+@(\\w+.)+[a-z]{2,3}
     */
    private static Pattern PATTERN_EMAIL = Pattern.compile("\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*");
    /**
     * 银联卡
     */
    private static Pattern PATTERN_BANKCARD = Pattern.compile("^\\d{19}$");
    /**
     * 信用卡
     */
    private static Pattern PATTERN_CREDITCARD = Pattern.compile("^\\d{16}$");
    /**
     * 身份证
     */
    private static Pattern PATTERN_IDCARD = Pattern.compile("^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$|^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|[X|x])$");
    /**
     * 姓名(中、英)
     */
    private static Pattern PATTERN_NAME = Pattern.compile("^([\\u4e00-\\u9fa5]+|([a-zA-Z]+\\s?)+)$");
    /**
     * 一般文章(中、英、数字)
     * [a-zA-Z0-9\u4e00-\u9fa5]+
     * 没过滤字符和数字的:[a-zA-Z0-9\\u4e00-\\u9fa5,,.。??;;::!!(())《<》>…\"“”‘’、]+
     */
    private static Pattern PATTERN_TXT = Pattern.compile("[a-zA-Z0-9\\u4e00-\\u9fa5]+");

    /**
     * 判断给定字符串是否空白串。 空白串是指由空格、制表符、回车符、换行符组成的字符串 若输入字符串为null或空字符串,返回true
     *
     * @param input
     * @return boolean
     */
    public static boolean isContainEmptString(String input) {
        if (input == null || "".equals(input))
        {  return true;}

        for (int i = 0; i < input.length(); i++) {
            char c = input.charAt(i);
            if (c == ' ' || c == '\t' || c == '\r' || c == '\n') {
                return true;
            } else {
                if (i == input.length() - 1) {
                    return false;
                }
            }
        }
        return true;
    }

    /**
     * encoded in utf-8
     *
     * @param str
     * @return
     * @throws UnsupportedEncodingException if an error occurs
     */
    public static String utf8Encode(String str) {
        //提示:不同的编码方式length可能不同
        if (!isEmpty(str) && str.getBytes().length != str.length()) {
            try {
                return URLEncoder.encode(str, "UTF-8");
            } catch (UnsupportedEncodingException e) {
                throw new RuntimeException("UnsupportedEncodingException occurred. ", e);
            }
        }
        return str;
    }

    /**
     * 拆分字符串
     *
     * @param buffer
     * @param regex  拆分判断 比如按逗号拆分","
     * @return
     */
    public static String[] split(String buffer, String regex) {
        return buffer.split(regex);
    }

    /**
     * 判断手机号
     */
    public static boolean isMobileNO(String mobiles) {
        return PATTERN_ISMOBILE.matcher(mobiles).matches();
    }

    /**
     * 判断邮编
     */
    public static boolean isZipNO(String zipString) {
        return PATTERN_ZIP.matcher(zipString).matches();
    }

    /**
     * 判断邮箱是否合法
     */
    public static boolean isEmail(String email) {
        if (null == email || "".equals(email)) {
            return false;
        }
        return PATTERN_EMAIL.matcher(email).matches();
    }

    /**
     * 判断是否是银联银行卡号(银联都是19位数字)
     */
    public static boolean isBankCard(String bankcard) {
        return PATTERN_BANKCARD.matcher(bankcard).matches();
    }

    /**
     * 判断是否是银行卡号(信用卡都是16位数字)
     */
    public static boolean isCreditCard(String bankcard) {
        return PATTERN_CREDITCARD.matcher(bankcard).matches();
    }


    /**
     * 判断是否是15或者18位身份证
     */
    public static boolean isIdCard(String id) {
        return PATTERN_IDCARD.matcher(id).matches();
    }

    /**
     * 判断是否是中英文的姓名
     */
    public static boolean isName(String name) {
        return PATTERN_NAME.matcher(name).matches();
    }

    /**
     * 英文、数字、中文的验证
     *
     * @param str
     * @return
     */
    public static boolean isTxt(String str) {
        return PATTERN_TXT.matcher(str).matches();
    }

    /**
     * 判断给定的密码是否为空,如果不为空,再判断给定的密码是不是6到15位,如果正确,则返回true,如果不正确,则返回false
     *
     * @param password
     * @return
     */
    public static boolean isPassword(CharSequence password) {
        if (isEmpty(password)) {
            Toast.makeText(MyApplication.getInstance(), "请输入密码", Toast.LENGTH_SHORT);
            return false;
        }
        if (password.length() < 6 || password.length() > 15) {
            Toast.makeText(MyApplication.getInstance(), "密码长度为6到15位", Toast.LENGTH_SHORT);
            return false;
        } else {
            return true;
        }
    }


    /**
     * 判断用户名是否合法
     *
     * @param username
     * @return
     */
    public static boolean isUserName(CharSequence username) {
        if (isEmpty(username)) {
            Toast.makeText(MyApplication.getInstance(), "请输入用户名", Toast.LENGTH_SHORT);
            return false;
        }
        if (username.length() <= 8 && username.length() >= 2) {
            return true;
        } else {
            Toast.makeText(MyApplication.getInstance(), "用户名长度为2-8", Toast.LENGTH_SHORT);
            return false;
        }
    }

    /**
     * @param value 值
     * @return 特定string
     * @See 拿到序列化的数值
     */
    public static String getNumberFormat(double value) {
//         NumberFormat numberFormat = NumberFormat.getInstance();
//         NumberFormat numberFormat = NumberFormat.getIntegerInstance();
        NumberFormat numberFormat = NumberFormat.getCurrencyInstance(Locale.CHINA);//带金额符号
        // NumberFormat numberFormat = NumberFormat.getNumberInstance();
        // NumberFormat numberFormat = NumberFormat.getPercentInstance();//带百分比
        numberFormat.setMaximumFractionDigits(4);//小数点后面最多显示位数
//         numberFormat.setMinimumFractionDigits(3);//小数点后面最少显示位数
//         numberFormat.setMaximumIntegerDigits(4);//小数点前面的最多显示位数
//         numberFormat.setMinimumIntegerDigits(1);//小数点前面的最少显示位数,默认为1
        return numberFormat.format(value);
    }

    /**
     * 生成length长度的随机字符创(由大小写和数字构成)
     *
     * @param length 随机字符串长度
     * @return
     */
    public static String getRandomString(int length) {
        // ASCII码对照表:http://ascii.911cha.com/       int是可以直接转char的,比如是65就是A   97是a
        Random random = new Random();
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < length; i++) {
            int number = random.nextInt(3);
            long result = 0;
            switch (number) {
                case 0:
                    result = Math.round(Math.random() * 25 + 65);
                    sb.append(String.valueOf((char) result));
                    break;
                case 1:
                    result = Math.round(Math.random() * 25 + 97);
                    sb.append(String.valueOf((char) result));
                    break;
                case 2:
                    sb.append(String.valueOf(new Random().nextInt(10)));
                    break;
            }
        }
        return sb.toString();
    }

    /**
     * 是否是车牌号
     * @param carnumber
     * @return
     */
    public static boolean isCarnumberNO(String carnumber) {
        /*
         *   1.常规车牌号:仅允许以汉字开头,后面可录入六个字符,由大写英文字母和阿拉伯数字组成。如:粤B12345;有后五位不准用I和O的规定,毕竟长得像1和0;
         *   2.武警车牌:允许前两位为大写英文字母,后面可录入五个或六个字符,由大写英文字母和阿拉伯数字组成,其中第三位可录汉字也可录大写英文字母及阿拉伯数字,第三位也可空,如:WJ警00081、WJ京1234J、WJ1234X。
         *   3.最后一个为汉字的车牌:允许以汉字开头,后面可录入六个字符,前五位字符,由大写英文字母和阿拉伯数字组成,而最后一个字符为汉字,汉字包括“挂”、“学”、“警”、“军”、“港”、“澳”。如:粤Z1234港。
         *   4.新军车牌:以两位为大写英文字母开头,后面以5位阿拉伯数字组成。如:BA12345。
         *   5.新能源车牌:前2位和普通车牌一样,中小型新能源车,第三位只能D/F,后面必须为数字(例如:京A D08000)。大型的则是最后一位必须为D/F。
         */
        String regex = "^([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳])"
                +"|([A-Z]{2}[警京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼]{0,1}[0-9]{4}[A-HJ-NP-Z0-9])"
                +"|([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z](([0-9]{5}[DF])|([DF]([A-HJ-NP-Z0-9])[0-9]{4})))"+"$";
        if (TextUtils.isEmpty(carnumber)) {
            return false;
        } else {
            return carnumber.matches(regex);
        }
    }
}

贴一段车辆的验证代码

----普通车----
湘F55588:true
----警车----
WJ警00081:true
WJ京1234J:true
WJ1234X:true
----新能源车----
渝DD13456:true
渝DF13456:true
渝D13456F:true
----教练、学员车等包含末尾汉字的----
川A123AB:true
川A2222学:true
粤Z1234港:true
--------错误车牌---------
川A2222I:false
川AA12345:false

后话

1.4jdk之后,string有自己的matches方法,封装了Pattern在方法内。不需要自己写Pattern了,可以简化不少代码。

你可能感兴趣的:(Android)