Java 正则表达式详解
Java 提供了强大的正则表达式支持,位于 java.util.regex
包中。正则表达式(Regular Expression)是一种用来定义字符串匹配模式的语言,广泛应用于字符串的搜索、替换和分割等操作。
1. 核心类和接口
在 Java 中,正则表达式的主要实现依赖以下两个类:
Pattern
:- 编译后的正则表达式。
- 提供用于定义和编译正则表达式的方法。
Matcher
:- 用于执行匹配操作的引擎。
- 提供了匹配、查找、替换等操作的方法。
2. Pattern
类
Pattern
类用于表示编译后的正则表达式。它提供了以下主要方法:
2.1 编译正则表达式
使用 Pattern.compile(String regex)
编译正则表达式:
Pattern pattern = Pattern.compile("\\d+"); // 匹配一个或多个数字
2.2 常用方法
方法 | 描述 |
---|---|
compile(String regex) | 编译正则表达式,返回一个 Pattern 对象。 |
matcher(CharSequence input) | 返回一个 Matcher 对象,用于匹配指定输入字符串。 |
split(CharSequence input) | 根据正则表达式分割输入字符串,返回一个字符串数组。 |
pattern() | 返回正则表达式的字符串表示。 |
3. Matcher
类
Matcher
类用于操作正则表达式并执行匹配。它主要依赖于一个 Pattern
对象。
3.1 创建 Matcher
通过 Pattern.matcher(CharSequence input)
创建:
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher("abc123def456");
3.2 常用方法
方法 | 描述 |
---|---|
matches() | 检查整个字符串是否完全匹配正则表达式。 |
find() | 查找字符串中与正则匹配的子串(可多次调用找到多个匹配)。 |
group() | 返回最近一次匹配的子串。 |
start() | 返回最近一次匹配的子串在输入中的起始索引。 |
end() | 返回最近一次匹配的子串在输入中的结束索引(不包括结束位置)。 |
replaceAll(String replacement) | 用指定字符串替换所有匹配的子串。 |
replaceFirst(String replacement) | 用指定字符串替换第一个匹配的子串。 |
group(int group) | 返回捕获组的子串。 |
groupCount() | 返回正则表达式中的捕获组数目。 |
4. 快速上手
4.1 匹配
import java.util.regex.*;public class RegexExample {public static void main(String[] args) {String input = "123abc456";Pattern pattern = Pattern.compile("\\d+"); // 匹配一个或多个数字Matcher matcher = pattern.matcher(input);System.out.println("Input: " + input);System.out.println("Pattern: " + pattern.pattern());while (matcher.find()) {System.out.println("Match: " + matcher.group() + " at [" + matcher.start() + ", " + matcher.end() + ")");}}
}
输出:
Input: 123abc456
Pattern: \d+
Match: 123 at [0, 3)
Match: 456 at [6, 9)
4.2 分割
import java.util.regex.*;public class SplitExample {public static void main(String[] args) {String input = "apple,orange;banana grape";Pattern pattern = Pattern.compile("[,; ]"); // 匹配逗号、分号或空格String[] result = pattern.split(input);for (String word : result) {System.out.println(word);}}
}
输出:
apple
orange
banana
grape
4.3 替换
import java.util.regex.*;public class ReplaceExample {public static void main(String[] args) {String input = "abc123def456";Pattern pattern = Pattern.compile("\\d+"); // 匹配数字Matcher matcher = pattern.matcher(input);String replaced = matcher.replaceAll("#"); // 替换所有数字为 #System.out.println(replaced); // 输出:abc#def#}
}
4.4 验证输入
import java.util.regex.*;public class ValidationExample {public static void main(String[] args) {String email = "user@example.com";Pattern pattern = Pattern.compile("^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$");Matcher matcher = pattern.matcher(email);if (matcher.matches()) {System.out.println("Valid email");} else {System.out.println("Invalid email");}}
}
5. 正则表达式语法
5.1 常用元字符
元字符 | 描述 | 示例 |
---|---|---|
. | 匹配任意单个字符(换行符除外)。 | a.c 匹配 abc 或 a-c 。 |
\d | 匹配数字 [0-9] 。 | \d+ 匹配 123 、456 。 |
\D | 匹配非数字字符。 | \D+ 匹配 abc 。 |
\w | 匹配字母、数字或下划线 [A-Za-z0-9_] 。 | \w+ 匹配 word_123 。 |
\W | 匹配非字母、数字或下划线。 | \W+ 匹配 @!# 。 |
\s | 匹配空白字符(空格、制表符等)。 | \s+ 匹配空格或换行。 |
\S | 匹配非空白字符。 | \S+ 匹配非空白部分。 |
5.2 量词
量词 | 描述 | 示例 |
---|---|---|
* | 匹配前一个字符 0 次或多次。 | a* 匹配 "" 、a 、aaa 。 |
+ | 匹配前一个字符 1 次或多次。 | a+ 匹配 a 、aaa 。 |
? | 匹配前一个字符 0 次或 1 次。 | a? 匹配 "" 、a 。 |
{n} | 匹配前一个字符恰好 n 次。 | a{3} 匹配 aaa 。 |
{n,} | 匹配前一个字符至少 n 次。 | a{2,} 匹配 aa 、aaa 。 |
{n,m} | 匹配前一个字符 n 到 m 次。 | a{1,3} 匹配 a 、aa 、aaa 。 |
5.3 边界匹配
边界 | 描述 | 示例 |
---|---|---|
^ | 匹配行的开头。 | ^abc 匹配以 abc 开头的字符串。 |
$ | 匹配行的结尾。 | abc$ 匹配以 abc 结尾的字符串。 |
\b | 匹配单词边界。 | \bword\b 匹配 word 。 |
\B | 匹配非单词边界。 | \Bword\B 不匹配 word 。 |
5.4 分组和引用
语法 | 描述 | 示例 |
---|---|---|
() | 定义一个分组。 | (abc)+ 匹配 abcabc 。 |
` | ` | 或运算符,表示匹配多个选项之一。 |
\n | 引用第 n 个分 | |
组的匹配。 | (.)\1 匹配重复字符,如 aa 。 |
6. 总结
优点
- Java 正则表达式强大且灵活,支持复杂的匹配模式。
- 提供了丰富的 API,可以方便地操作字符串(如匹配、分割和替换)。
注意事项
- 正则表达式是大小写敏感的。
- 特殊字符需要转义(如
.
、*
、?
)。 - 复杂正则可能难以阅读,建议添加注释或使用分组提高可读性。
正则表达式在 Java 中的应用非常广泛,如验证用户输入、文本分析、日志处理等。合理使用正则表达式,可以大大提高代码效率和简洁性。