1. 正则表达式的构造摘要简介
1.1 字符类
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)
[a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](并集)
[a-z&&[def]] d、e 或 f(交集)
[a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](减去)
[a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](减去)
1.2 预定义字符类
. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
1.3 Greedy 数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
1.4 边界匹配器
^ 行的开头
$ 行的结尾
\b 单词边界
\B 非单词边界
\A 输入的开头
\G 上一个匹配的结尾
\Z 输入的结尾,仅用于最后的结束符(如果有的话)
\z 输入的结尾
2. 正则表达式对字符的常见操作
正则表达式对字符串的常见操作:
1, 匹配。
其实使用的就是String类中的matches方法。
2,切割。
其实使用的就是String类中的split方法。
3,替换。
其实使用的就是String类中的replaceAll()方法。
4,获取。
2.1 匹配
//匹配手机号码是否正确。
String tel = "15800001111";
String regex = "1[358]\\d{9}";
boolean b = tel.matches(regex);
System.out.println(tel+":"+b);
2.2 切割
将字符串中的人名分割开
String str = "zhangsanttttxiaoqiangmmmmmmzhaoliu";
String[] names = str.split("(.)\\1+");//str.split("\\.");
for(String name : names){
System.out.println(name);
}
小括号是组,(.)是第一组,\1是\1,代表第一组,也就是复用,+号代表依次或多次
“ ”以空格切
“#”以#号切
如果字符串中有多个空格“ +”,多个空格
2.3 替换
将多个字母替换成一个
String str = "zhangsanttttxiaoqiangmmmmmmzhaoliu";
str = str.replaceAll("(.)\\1+", "$1");
System.out.println(str);
将电话号码中间四位用*号代替
String tel = "15800001111";//158****1111;
tel = tel.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
System.out.println(tel);
(“(.)\1+”, “ 1") 1 " ) 1是用第一个参数的第一组数据,$是引用上一参数
这样可以将多个t和6个m换成一个
(“(\d{3})\d{4}(\d{4})”, “ 1∗∗∗∗ 1 ∗ ∗ ∗ ∗ 2”)保留电话号码的头和尾,中间我直接用4个*号代替就好了
(\d{3})将数字重复三次并且把它放在第一组里面
2.4 获取
将字符串中三个字符的单词找出来
String str = "da jia hao,ming tian bu fang jia!";
String regex = "\\b[a-z]{3}\\b";
//1,将正则封装成对象。
Pattern p = Pattern.compile(regex);
//2, 通过正则对象获取匹配器对象。
Matcher m = p.matcher(str);
//使用Matcher对象的方法对字符串进行操作。
//既然要获取三个字母组成的单词
//查找。 find();
System.out.println(str);
while(m.find()){
System.out.println(m.group());//获取匹配的子序列
System.out.println(m.start()+":"+m.end());
}
“\b[a-z]{3}\b”, \b代表字符边界 ,[a-z]{3}代表三个小写字母获取的三个步骤