正则表达式整理

正则表达式相关语法

特殊字符:

^ 匹配输入字符串的开始位置
$ 匹配输入字符串的结尾位置,举个例子:"^-?\\d+$"匹配整数"1",如果不带$,那么"^-?\\d+"不仅匹配整数"1",也匹配"1asdd"这种格式
* 匹配前面的子表达式零次或多次
+ 匹配前面的子表达式一次或多次,也就是说至少匹配一次
? 匹配前面的子表达式零次或一次
| 即竖线,指明两项之间的一个选择
\ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符,例如'n'匹配字符'n'、'\n'匹配换行符、'\\'匹配'\'、'\.'匹配'.'
() 标记一个子表达式的开始和结束位置
[] 标记一个中括号表达式的开始和结束位置
{} 标记限定符表达式的开始和结束位置

限定符:除了 * 、 + 和 ? 外还有

{n} n是一个非负整数,匹配确定的n次
{n,} n是一个非负整数,至少匹配n次
{n,m} m和n均为非负整数,其中n<=m,最少匹配n次且最多匹配m次,如{1,3}表示匹配1到3个

更多语法参考菜鸟教程

记录一下开发过程中常用的几个正则表达式(使用Kotlin语言开发):

object RegexConstant {

    /*---------------------------------校验数字的正则表达式 start---------------------------------*/

    //数字,包括整数和小数、正数和负数,不匹配"+"开头的数字,如需匹配使用"^[-\\+]?xxx",下同
    const val DIGIT = "^-?(\\d+(\\.\\d+)?)$"

    //整数
    const val INTEGER = "^-?\\d+$"

    //非0的正整数
    const val POSITIVE_INTEGER = "^[1-9]\\d*$"

    //非0的负整数
    const val NEGATIVE_INTEGER = "^-[1-9]\\d*$"

    //非正整数,即负整数和0
    const val NOT_POSITIVE_INTEGER = "^-[1-9]\\d*$|0$"

    //非负整数,即正整数和0
    const val NOT_NEGATIVE_INTEGER = "^[1-9]\\d*$|0$"

    //浮点数,不包括整数
    const val FLOAT = "^-?[1-9]\\d*\\.\\d+$|^-?0\\.\\d+$"

    //正浮点数,不包括整数
    const val POSITIVE_FLOAT = "^[1-9]\\d*\\.\\d+$|^0\\.\\d+$"

    //负浮点数,不包括整数
    const val NEGATIVE_FLOAT = "^-[1-9]\\d*\\.\\d+$|-0\\.\\d+$"

    //非正浮点数,包括负浮点数和0或0.00
    const val NOT_POSITIVE_FLOAT = "^-[1-9]\\d*\\.\\d+$|-0\\.\\d+$|0(\\.\\0*)?$"

    //非负浮点数,包括正浮点数和0或0.00
    const val NOT_NEGATIVE_FLOAT = "^[1-9]\\d*\\.\\d+$|^0\\.\\d+$|0(\\.\\0*)?$"

    //带2位小数的浮点数
    const val FLOAT_WITH_TWO_DECIMAL = "^-?[1-9]\\d*\\.\\d{2}$|^-?0\\.\\d{2}$"

    /*---------------------------------校验数字的正则表达式 end---------------------------------*/


    /*---------------------------------校验字符的正则表达式 start---------------------------------*/

    //汉字
    const val CHINESE = "^[\\u4e00-\\u9fa5]+$"

    //双字节字符(包括汉字在内)
    const val DOUBLE_BYTE_CHAR = "[^\\x00-\\xff]"

    //英文字母或数字,至少包含一个字符
    const val LETTER_OR_DIGIT = "^[A-Za-z0-9]+$"

    //英文字母和数字,至少包含一个英文字母和一个数字
    const val LETTER_AND_DIGIT = "^(?=.*[0-9].*)(?=.*[A-Za-z].*).{2,}$"

    //大写字母和小写字母和数字,至少包含一个大写字母、一个小写字母和一个数字
    const val UPPER_AND_LOWER_CASE_LETTER_AND_DIGIT =
        "^(?=.*[0-9].*)(?=.*[A-Z].*)(?=.*[a-z].*).{3,}$"

    /*---------------------------------校验字符的正则表达式 end---------------------------------*/


    /*---------------------------------特殊需求的正则表达式 start---------------------------------*/

    //手机号(简单)
    const val MOBILE_SIMPLE = "^[1]\\d{10}$"

    /**
     * 手机号(精确)
     * 移动:134(0-8)、135、136、137、138、139、147、150、151、152、157、158、159、178、182、183、184、187、188
     * 联通:130、131、132、145、155、156、175、176、185、186
     * 电信:133、153、173、177、180、181、189
     * 全球星:1349
     * 虚拟运营商:170
     */
    const val MOBILE_EXACT =
        "^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0,3,5-8])|(18[0-9])|(147))\\d{8}$"

    //固定电话号码
    const val TEL_PHONE = "^0\\d{2,3}[- ]?\\d{7,8}"

    //15位身份证号码
    const val ID_CARD_15 = "^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$"

    //18位身份证号码
    const val ID_CARD_18 =
        "^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9Xx])$"

    //邮箱
    const val EMAIL = "^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$"

    //URL
    const val URL = "[a-zA-z]+://[^\\s]*"

    //yyyy-MM-dd格式的日期校验,已考虑平闰年
    const val DATE =
        "^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$"

    //IP地址
    const val IP =
        "((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)"

    //QQ号
    const val QQ = "[1-9][0-9]{4,}"

    //中国邮政编码
    const val POSTAL_CODE = "[1-9]\\d{5}(?!\\d)"

    /*---------------------------------特殊需求的正则表达式 end---------------------------------*/

}

封装一个正则表达式工具类:

object RegexUtil {

    //是否是数字
    fun isDigit(content: String): Boolean = isMatch(RegexConstant.DIGIT, content)

    //是否是整数
    fun isInteger(content: String): Boolean = isMatch(RegexConstant.INTEGER, content)

    //是否是浮点数
    fun isFloat(content: String): Boolean = isMatch(RegexConstant.FLOAT, content)

    //是否是汉字
    fun isChinese(content: String): Boolean = isMatch(RegexConstant.CHINESE, content)

    //英文字母或数字
    fun isLetterOrDigit(content: String): Boolean = isMatch(RegexConstant.LETTER_OR_DIGIT, content)

    //英文字母和数字
    fun isLetterAndDigit(content: String): Boolean =
        isMatch(RegexConstant.LETTER_AND_DIGIT, content)

    //是否是手机号
    fun isMobile(content: String): Boolean = isMatch(RegexConstant.MOBILE_EXACT, content)

    //是否是身份证号
    fun isIdCard(content: String): Boolean =
        isMatch(RegexConstant.ID_CARD_15, content) || isMatch(RegexConstant.ID_CARD_18, content)

    //是否是"yyyy-MM-dd"的日期格式
    fun isyyyyMMdd(content: String): Boolean = isMatch(RegexConstant.DATE, content)

    /**
     * 是否匹配正则表达式
     *
     * @param regex   正则表达式
     * @param content 文本
     */
    fun isMatch(regex: String, content: String): Boolean = Pattern.matches(regex, content)

    //提取文本中的数字,包括整数和小数、正数和负数,如果存在多个,以指定的分隔符隔开
    fun extractDigit(content: String, delimiter: String = " "): String =
        extract("(-)?(\\d+(\\.\\d+)?)", content, delimiter)

    /**
     * 提取文本中匹配给定正则表达式的内容,如果存在多个,以指定的分隔符隔开
     *
     * @param regex     正则表达式
     * @param content   文本
     * @param delimiter 分隔符
     */
    fun extract(regex: String, content: String, delimiter: String = " "): String {
        val sb = StringBuilder()
        val pattern = Pattern.compile(regex)
        val matcher = pattern.matcher(content)
        while (matcher.find()) {
            sb.append(matcher.group()).append(delimiter)
        }
        val result = sb.toString()
        return result.substring(0, result.length - delimiter.length)
    }

}

另外分享一个正则表达式在线测试地址

你可能感兴趣的:(Android工具篇)