正则表达式相关语法
特殊字符:
^ | 匹配输入字符串的开始位置 |
$ | 匹配输入字符串的结尾位置,举个例子:"^-?\\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)
}
}
另外分享一个正则表达式在线测试地址