正则表达式
正则表达式与编程语言无关,是用来校验字符串的规则。
//校验str是否符合指定的正则表达式,其中regex是正则表达式,是一个字符串,返回值为boolean 类型
boolean ret = str.matches(regex);
^:是用来匹配一个字符串的开头
$:是用来匹配一个字符串的结尾(一般来说是和^成对出现的)
[]:用来匹配一位字符
[abc]:表示这位字符可以是a,也可以是b,也可以是c
[a-z]:是一个小写字母
[a-zA-Z]:是一个字母
[^abc]:表示除了a、b、c外的任意字符
[0-9]:表示一个数字
[^0-9]表示除了数字之外的字符
//需求:校验一个字符串中,某一位不能是任意小写字母,但是hij除外
str.matches("^[^a-z[hij]]$");
\:转义字符,在java中写正则表达式,一般用\\
.:通配符,可以表示任意的一个字符
//判断是不是'.'
"/".matches("^\\.$");
简写形式:
\d:等价于[0-9],用来匹配任意的一个数字
\D:等价于 [^0-9] ,用来匹配任意的一个非数字
\w:可以匹配任意的大小写字母数字和下划线
\W:可以匹配任意的非大小写字母数字和下划线
+:表示前面的一位或者一组字符出现一次或多次
?:表示前面的一位或一组字符出现一次或两次
*:表示前面的一位或一组字符出现零次或多次
"helllllo".matches("^hel*o$");
"hello world".matches("^hello \\w+$");
"1234567890".matches("^\\d+$");
"hello".matches("^hel?lo$");
{m}:表示前面的一位或一组连续出现m次
{m,}:表示前面的一位或一组连续出现至少m次
{m,n}:表示前面的一位或一组连续出现至少m次,至多n次
"hellllo".maeches("^hel{0,5}o$");
():表示一个分组,可以将他们是为一个整体
"hello hello hello hello world".matches("^(hello )+world$");
|:或,一般用在分组中
"hi world".matches("^(hi|hello) world$");
案例:
1.验证一个qq是否是一个合法的qq号(长度[6-12],纯数字,不以0开头)
"123456".matches("^[1-9]\\\d{5,11}$");
2.判断一个数字是不是一个二进制
"0b110011000001".matches("^0b[01]+$");
3.判断一个数字是不是一个十六进制
"0x123ABC".matches("^0x[0-9A-Fa-f]+$");
4.验证一个邮箱是不是QQ邮箱、126邮箱、163邮箱
"asdasd@126.com".matches("^\\w+@(qq|QQ|126|163)\\.com$");
Pattern类:用来操作正则表达式的类
Matcher类:用来校验结果的集合
pattern的静态方法:
boolean ret = Pattern.matches("^[1-9]\\d{5,11}$","17110658843");
Pattern的对象获取:由于Pattern没有无参构造,而且Pattern 的有参构造都是不可见的。因此,无法通过new的方式进行对象实例化
Pattern p = Pattern.complie("[1-9]\\d{5,10}");
校验指定的字符串是否合乎正则表达式的规则
Matcher m = p.matcher("13570948930");
m.pattern();//获取用来校验的正则对象
m.matches();//获取校验的结果
案例:将一个手机号中间四位替换为****
String regex = "^(1[3,5,6,7,8]\\\d)(\\\d{4})(\\\d{4})$"
Matcher m1 = Pattern.compile(regex).matcher("18807764545");
//分组前,需要先调用find()
m1.find();
System.out.println(m1.groupCount());
System.out.println(m1.group(0));
System.out.println(m1.group(1));
System.out.println(m1.group(2));
System.out.println(m1.group(3));
System.out.println("18877665544".replaceAll("^(1[3578]\\d)(\\d{4})(\\d{4})$", "$1****$3"));