正则表达式的基本使用
(1)先看一下字符类
[]表示一个字符:
[abc]: abc其中的一个字符。
[a-z]: a-z中的任意一个字符。
[0-9]: 0-9中任意一个数字。
[a-zA-Z]: a-z或者A-Z中任意一个字符。
[^def]: 求补集,不是def中的一个字符。
[a-c[e-g]]: 求并集,即a-c或者e-g中的一个字符。
[a-z&&[def]]: 求交集,即def中的一个字符。
(2)开头,结尾匹配
^表示开头,例如:"^abc.*",以“abc”开头的。
$表示结尾,例如:".*xyz$",以“xyz”结尾的。
(3)单个字符的其他表示
. 任意一个字符。
\d 数字:[0-9]
\D 非数字:[^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
注意:“\小写字母”代表一类字符,“\大写字母”代表相反的字符。
字符串中写“\” 代表 “\”。一个反斜杆表示转义,两个反斜杆代表一个反斜杠。
(4)数量词
X?:X出现0次或1次,?表示是否有一个。
X*:X出现0次或多次,*表示任意个。
X+:X出现1次或多次,+表示至少有一个。
X{n}:X恰好出现n次。
X{n,m}:X出现n-m次,n和m都包括了。
(5)正则表达式的分组:
捕获组通过数从左到右的开口括号计数编号。
例如:表达((A)(B( C)))。
有四个这样的团体:
0 ((A)(B( C)))
1 (A)(B( C))
2 (A)
3 (B( C))
4 ( C)
零组总是代表整个表达式。
$1表示第1组的值。
public class Test_ResetPhoneNum {
public static void main(String[] args) {
String phone = "13500001111";
System.out.println(phone.matches("^(1[3-9])\\d{9}$")); // true
String resetPhone = phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
System.out.println(resetPhone); // 135****1111
}
}
例1:高高兴兴,快快乐乐,这样的叠词怎么匹配?
(.)\1(.)\2,\1表示第一组再出现1次,\2表示第二组再出现1次。
注意:(.)\1+,表示第一组至少出现1次。
例2:高兴高兴,快乐快乐,这样的叠词怎么匹配?
(…)\1
例3:将"我…我我…我…我…我我要.要…要…要要…学.学…学…学学.编.编…程…程."
变成:“我要学编程”
String s = “我…我我…我…我…我我要.要…要…要要…学.学…学…学学.编.编…程…程.”;
String s2 = ("\.+", “”);
String s3 = ("(.)\1+", “$1”);
测试代码:
package patterntest;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//练习题:
public class Test02 {
public static void main(String[] args) {
// 取出字符串中的三个手机号。
String s = "我的第一个手机号是13511112222,第二个手机号是15722223333,第三个手机号是18733334444。";
Pattern p = Pattern.compile("[1][358][0-9]{9}"); // 获取指定的正则表达式
Matcher m = p.matcher(s); // 获取匹配器
boolean b = m.matches(); // 获取匹配的结果
System.out.println(b); // false 因为原文很长,怎么可能全是这几个数字
while (m.find()) {
int start = m.start();
int end = m.end();
String phone = m.group();
System.out.println("开始下标:" + start + ",结束下标:" + end);
System.out.println("手机号:" + phone);
System.out.println();
}
}
}