1. 正则表达式概述
正则表达式(Regular Expression)是处理字符串的强大工具,Java通过java.util.regex包提供完整的正则支持。正则表达式由普通字符和特殊字符(元字符)组成,形成一种描述字符串模式的"迷你语言"。
1.1 正则表达式的基本组成
String regex = "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}$";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher("example@email.com");
boolean isMatch = matcher.matches();
2. 常用元字符详解
2.1 基础元字符
| 元字符 |
名称 |
功能 |
示例 |
匹配示例 |
. |
点号 |
匹配任意单个字符 |
a.c |
“abc”, “a1c” |
^ |
脱字符 |
匹配行首 |
^Java |
“Java编程"中的"Java” |
$ |
美元符 |
匹配行尾 |
end$ |
“The end"中的"end” |
\d |
数字 |
匹配数字字符 |
\d\d |
“12”, “45” |
\w |
单词字符 |
匹配字母数字下划线 |
\w+ |
“hello”, “A1_” |
\s |
空白符 |
匹配空白字符 |
a\sb |
“a b” |
2.2 字符类元字符
String colorRegex = "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$";
| 表达式 |
含义 |
等价写法 |
[abc] |
匹配a、b或c |
`(a |
[^abc] |
匹配非a、b、c的字符 |
- |
[a-z] |
匹配a到z的小写字母 |
- |
[a-zA-Z] |
匹配所有字母 |
- |
3. 量词系统解析
3.1 基本量词
| 量词 |
含义 |
示例 |
匹配示例 |
* |
0次或多次 |
a*b |
“b”, “aab” |
+ |
1次或多次 |
a+b |
“ab”, “aaab” |
? |
0次或1次 |
a?b |
“b”, “ab” |
{n} |
恰好n次 |
a{2}b |
“aab” |
{n,} |
至少n次 |
a{2,}b |
“aab”, “aaaab” |
{n,m} |
n到m次 |
a{2,4}b |
“aab”, “aaaab” |
3.2 贪婪/勉强/独占量词对比
String text = "aaaab";
Pattern.compile("a+b").matcher(text).find();
Pattern.compile("a+?b").matcher(text).find();
Pattern.compile("a++b").matcher(text).find();
| 量词类型 |
符号 |
匹配策略 |
回溯机制 |
| 贪婪 |
*, +, ? |
尽可能多匹配 |
会回溯 |
| 勉强 |
*?, +?, ?? |
尽可能少匹配 |
会回溯 |
| 独占 |
*+, ++, ?+ |
尽可能多匹配 |
不回溯 |
4. 分组与捕获
4.1 分组类型
String phoneRegex = "^(\\+\\d{1,3})?[-.\\s]?((\\d{3})[-.\\s]?){2}\\d{4}$";
| 分组类型 |
语法 |
特点 |
示例 |
| 捕获分组 |
(pattern) |
捕获匹配内容 |
(\\d{3}) |
| 非捕获分组 |
(?:pattern) |
不捕获仅分组 |
(?:\\d{3}-){2} |
| 命名分组 |
(?<name>pattern) |
可命名引用 |
(?<area>\\d{3}) |
4.2 分组引用
String duplicateRegex = "\\b(\\w+)\\b\\s+\\1\\b";
Pattern.compile(duplicateRegex, Pattern.CASE_INSENSITIVE)
.matcher("hello hello world").find();
5. 零宽断言
5.1 断言类型对比
| 断言类型 |
语法 |
含义 |
示例 |
| 正向先行 |
(?=pattern) |
后面必须跟着pattern |
\\w+(?=;) |
| 负向先行 |
(?!pattern) |
后面不能跟着pattern |
\\d{3}(?!\\d) |
| 正向后行 |
(?<=pattern) |
前面必须是pattern |
(?<=\\$)\\d+ |
| 负向后行 |
(?<!pattern) | <