正则表达式通常用于处理字符串,主要功能是 校验(match)、分割(split)、替换(ReplaceAll)、查找(find)。
1 常用符号说明
(1) 常用字符
\ 转义字符
| 或
\d 数字:[0-9]
\w 单词字符:[a-zA-Z_0-9]
^ 行的开头
$ 行的结尾
\b 单词边界(指两个单词间的空格部分)
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)
(X) X,作为捕获组
(2)数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
\ 转义字符
| 或
\d 数字:[0-9]
\w 单词字符:[a-zA-Z_0-9]
^ 行的开头
$ 行的结尾
\b 单词边界(指两个单词间的空格部分)
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)
(X) X,作为捕获组
(2)数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
组说明:组零始终代表整个表达式, 从左到右,按左括号序号对应组号。$1表示组1匹配的内容
2 简单案例
(1)校验(match) 校验手机号码 ①11位数字 ②第二位必须是3或5或8
<span style="white-space:pre"> </span>public static void match_demo(){
<span style="white-space:pre"> </span>//校验手机号码 ①11位数字 ②第二位必须是3或5或8
<span style="white-space:pre"> </span>String phoneNum ="13565557890";
<span style="white-space:pre"> </span>System.out.print(phoneNum.matches("1[358]\\d{9}"));
<span style="white-space:pre"> </span>}
运行结果: true
(2)替换(replaceAll) 格式化句子,将多个空格替换为一个空格
<span style="white-space:pre"> </span>public static void replace_demo(){
//格式化句子,将多个空格替换为一个空格
String str = "I like Tom, but tom like Lucy!";
System.out.println(str.replaceAll(" +", " "));
}
运行结果: I like Tom, but tom like Lucy!
(3)分割(split) 分割出所有单词,按符号分,按可能多个空格分割
<span style="white-space:pre"> </span>public static void split_dome(){
//分割出所有单词,按符号分,按可能多个空格分割
String str = "I like Tom,but tom like Lucy!";
String[] strs = str.split(" +|,|!");
for(String s : strs){
System.out.println(s);
}
}
运行结果:
I
like
Tom
but
tom
like
Lucy
like
Tom
but
tom
like
Lucy
(4)查找
<span style="white-space:pre"> </span>public static void find_demo(){
//在句子中查找三个字符的单词
String str = "Iii like Tom,but tom like Lucy!";
String regex = "\\b[a-zA-z]{3}\\b";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
while(m.find()){
System.out.println(m.group() + " ;位置索引 " + m.start()+" : "+m.end());
}
}
Iii ;位置索引 0 : 3
Tom ;位置索引 12 : 15
but ;位置索引 16 : 19
tom ;位置索引 21 : 24
Tom ;位置索引 12 : 15
but ;位置索引 16 : 19
tom ;位置索引 21 : 24
3 附 组的相关例子
1 将句子还原成正常句子
<span style="white-space:pre"> </span>public static void dome1(){
String str = "我我我...我我我我我......我我我我我我爱.......爱爱爱爱爱爱爱...爱学学学学学学学编编....编编编编编编程..程程程程程...程程程";
System.out.println(str.replaceAll("\\.+", "").replaceAll("(.)\\1+", "$1"));
}
运行结果:
我爱学编程
2 将IP地址排序
<span style="white-space:pre"> </span>public static void dome2(){
String ip_str = "192.168.10.34 127.0.0.1 3.3.3.3 105.70.11.55";
String temp1 = ip_str.replaceAll("(\\d+)", "00$1");
String temp2 = temp1.replaceAll("0*(\\d{3})", "$1");
String[] strs = temp2.split(" +");
TreeSet<String> set = new TreeSet<String>();
for(String s : strs){
set.add(s);
}
for(String string : set){
System.out.println(string.replaceAll("0*(\\d+)", "$1"));
}
}
运行结果:
3.3.3.3
105.70.11.55
127.0.0.1
192.168.10.34
105.70.11.55
127.0.0.1
192.168.10.34