测试网址:https://regex101.com/
参考视频:参考视频网站
-
? : 表示前一个字符可以出现0次或1次
如a?可以匹配啊a,空格 -
* : 表示前一个字符可以出现0次到多次
a*会匹配a,aaa,空格 -
+ : 会匹配出现1次以上的字符
a+会匹配a,aa -
{} : 表示出现的范围
{6} 表示前一个字符出现6次
{2,6} 表示前一个字符出现2到6次
{2,} 表示前一个字符出现2次以上 -
() : 匹配多个字符
(ab)+ : 匹配ab出现一次以上的字符; -
| : 或运算符
a (cat|dog) :
会先匹配a空格后面接cat或者dog
这里的括号如果不加的话会不同,会匹配a cat 或者 dog -
[] : 可以匹配由相关字母组成的字符串
[abc]+ : 会匹配由abc组成的字符串,如aabbcc.abc
[a-zA-Z0-9] : 表示匹配小写字母,大写字母,数字组成的字符串
[^0-9] : 表示可以匹配所有的非数字字符 -
元字符:正则表达式为了方便定义的一些常用的
\d : 表示数字字符
\w : 单词字符(英文数字下划线)
\s : 空白符(空格,tab,换行符)
\D : 非数字字符
\W : 非单词字符
\S : 非空白字符
. : 表示任意字符(不包括换行符),如果要包括换行符使用[.\n]
^ : 匹配行首,如^a只会匹配行首的a
$ : 匹配行尾,a$只会匹配行尾的a -
贪婪匹配和懒惰匹配
贪婪匹配:尽可能多地匹配字符
懒惰匹配:尽可能少地匹配字符
如有字符串 <html>abcd</html>
我们想去匹配两侧的html标识,会写出<.+>但是就会发现会把整个字符串匹配起来
这是因为.是可以匹配任意字符的,而字符串的开头和结尾正好为<>所以会匹配整个字符串;
这时我们使用<.+?>就会把贪婪匹配转换为懒惰匹配
这时就只会匹配到开头和结尾的html标识了; -
实例讲解
- 匹配RGB颜色值:
#[a-fA-F0-9]{6}\b
意思:#开头,可以为字母a-f,A-F,0-9的6位字符串,最后使用\b表示边界; - IP地址的匹配
解释:用^开头,用$结尾,因为每一段的范围为0-255
public static boolean validIPAddress(String ip) {
if (ip == null) {
return false;
}
//个位数/1-9开头的两位数/1开头的3位数/2开头的分两种
String regex0 = "(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])";
//.代表任意字符所以用\.,将所有情况拼起来
String regexIpv4 = regex0 + "(\\." + regex0 + "){3}";
return ip.matches(regexIpv4);
}
- Android中的使用
匹配手机号:
解释:1开头,第二位为3,4,5,7,8
因为\d为中的\为特殊字符,所以为\d,然后九位的数字字符,即一共11位
public static boolean validPhoneNumber(String number) {
if (number == null) {
return false;
}
//1开头,第二位为34578,其余9位随意
String regex0 = "^1[3|4|5|7|8]\\d{9}$";
return number.matches(regex0);
}