10.正则表达式
1.基本介绍
- 正则表达式英文:Regex Expression
- 正则表达式是一种通用技术,适用于绝大多数流行的编程语言。
- 正则在线测试/常用正则式
2.单字符匹配
3.预定义字符
- 以一个反斜杠(\)开头,大部分为转义字符。
- 在java中,为了让正则表达式能完整地表示预定义字符,需要以两个反斜杠开头(\\ 就表示普通斜杠)
1 | String str = "123"; |
4.量词
1 | String regex = "6{3}"; |
5.捕获组
1 | "dog{3}" 匹配 doggg(do开头,g出现3次) |
6.边界匹配符
一些概念:
终止符:\r(回车符)、\n(换行符)、\r\n (回车换行)
输入:整个字符串
一行:以终止符结束的字符串片段,或整个输入的结尾的字符串片段。
(若输入是”dog\ndog\rdog“,那么3个dog各是一行)
边界匹配符,匹配的是位置,不是字符。
什么算是单词?:英文字母,数字,下划线,其他国家的文字,这些东西组合成单词。
什么是单词边界?:单词以外的东西,都是单词边界。
边界匹配符:
1 | // 表示dog左边是单词边界(\b),右边不能是单词边界(\B) |
7.举例
1 | 手机号码:"^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$" |
8.Pattern、Matcher
- String的matches方法:底层用到了Pattern、Matcher两个类。
- 如何在字符串中找到符合要求的字串呢?matcher.find()
1
2
3
4
5
6
7
8
9
10
11
12
13
14String input = "123_456_78_345";
String regex = "\\d{3}"; //至于为什么是两个\, 看3.预定义字符
// matches() 要求整个字符串 要符合 regex
input.matches(regex); // false
Pattern p = Pattern.compile(regex); // 编译正则式
Matcher matcher = p.matcher(input); // 将字符串放入比较器
// matcher.matches(); // false
matcher.find(); // true 在字符串中 查找符合regex 的子串
matcher.start(); // 返回上次匹配成功的开始索引 0
matcher.end(); // 返回上次匹配成功的结束索引 3
matcher.group(); // 返回上次匹配成功的 input 子序列 123 - 获得 匹配到的所有字串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33String input = "123_456_78_345";
String regex = "\\d{3}";
Pattern p = Pattern.compile(regex); // 编译正则式
Matcher matcher = p.matcher(input); // 将字符串放入比较器
while(matcher.find() != false){
System.out.println(matcher.group());
}
//封装成方法
public static void findAll(String regex, String input){
if(regex == null || input == null){
return;
}
Pattern p = Pattern.compile(regex); // 编译正则式
Matcher matcher = p.matcher(input); // 将字符串放入比较器
boolean found = false; // false 表示没找到
while (matcher.find() != false){
found = true;
System.out.format("\"%s\", [%d, %d)%n", matcher.group(), matcher.start(), matcher.end());
}
if(found == false){
System.out.println("No match.");
}
}
贪婪、勉强、独占的区别
- 贪婪:先吞掉整个输入的字符串,若整个串能完全匹配正则式,就输出此串。若不能完全匹配,吐出此串的最后一个字符,接着匹配。能匹配就输出,不能匹配接着删除新串的最后一个字符,如此循环。(从后往前匹配,保证了字串的最大化输出)
- 勉强:先吞掉 输入字符串 的第一个字符,判断是否能与正则式匹配。若匹配,输出匹配的内容,并从此字符的下一个字符开始,继续匹配。若不匹配,吞掉第二个字符,再判断是否与正则式匹配。如此循环,直到输入串全部吞进去。
- 独占:吞掉整个输入的字符串,若整个串能完全匹配正则式,就输出此串。否则就结束匹配。
1
2
3
4String input = "afooaaafooaa";
findAll(".*foo", input); // 贪婪 "afooaaafoo"
findAll(".*?foo", input); // 勉强 ["afoo", "aaafoo"]
findAll(".*+foo", input); // 独占 匹配失败
9.String类与正则式
String类中接收正则表达式 作为参数的 常用方法有:
1 | public String replaceAll(String regex, String replacement) {} |