Java 正则表达式
正则表达式(Regular Expression, Regex)是一个强大的字符串处理工具,它是一个特殊的字符序列,用于定义搜索模式。在 Java 中,处理正则表达式的核心功能位于 java.util.regex 包中。
什么是正则表达式?
正则表达式可以用来:
- 验证:检查一个字符串是否符合某种格式(如邮箱、手机号)。
- 查找:在一段文本中寻找所有匹配特定模式的子字符串。
- 替换:找到匹配的子字符串并将其替换为其他内容。
- 分割:根据模式来分割字符串。
java.util.regex 包的核心类
Pattern类: 代表一个编译后的正则表达式。一个Pattern对象本身没有公共构造方法,需要通过其静态方法Pattern.compile()来创建。Matcher类: 是一个正则表达式的匹配器引擎。它通过解释Pattern对输入的字符串执行匹配操作。Matcher对象是通过pattern.matcher(inputString)方法获得的。
基本匹配流程
使用正则表达式通常遵循以下三步:
- 使用
Pattern.compile(regex)创建一个Pattern对象。 - 使用
pattern.matcher(input)创建一个Matcher对象。 - 使用
Matcher对象的方法(如find(),matches())来执行匹配。
java
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExample {
public static void main(String[] args) {
String text = "The quick brown fox jumps over the lazy dog.";
String regex = "\\b[a-zA-Z]{3}\\b"; // 匹配所有长度为 3 的单词
// 1. 编译正则表达式
Pattern pattern = Pattern.compile(regex);
// 2. 创建匹配器
Matcher matcher = pattern.matcher(text);
// 3. 查找匹配项
System.out.println("在文本中找到所有3个字母的单词:");
while (matcher.find()) {
// find() 尝试寻找下一个匹配项
// group() 返回当前找到的匹配子串
System.out.println("找到: '" + matcher.group() + "' at index " + matcher.start());
}
}
}
// 输出:
// 找到: 'The' at index 0
// 找到: 'fox' at index 16
// 找到: 'the' at index 31
// 找到: 'dog' at index 40注意: 在 Java 字符串中,反斜杠
\是一个转义字符,所以为了在正则表达式中使用一个\,你需要在字符串中写入\\。
Matcher 类的常用方法
matches(): 尝试将整个输入字符串与模式进行匹配。只有整个字符串完全匹配时才返回true。find(): 尝试查找输入字符串中与模式匹配的下一个子序列。每次调用都会从上一次匹配结束的位置继续搜索。lookingAt(): 尝试从输入字符串的开头开始匹配模式。如果开头部分匹配,则返回true,不要求整个字符串都匹配。group(): 返回由上一次匹配操作(如find())捕获的子字符串。start()/end(): 返回上一次匹配的子字符串的起始索引和结束索引(不含)。replaceAll(replacement): 替换所有匹配的子字符串。
String 类中的正则表达式方法
为了方便使用,String 类也内置了一些直接支持正则表达式的方法。
boolean matches(String regex): 判断整个字符串是否匹配给定的正则表达式。等效于Pattern.matches(regex, this)。javaString email = "test@example.com"; // 一个简单的邮箱格式验证 boolean isValid = email.matches("^[\\w.-]+@[\\w.-]+\\.[a-zA-Z]{2,}$"); System.out.println("邮箱格式是否有效: " + isValid); // trueString[] split(String regex): 根据正则表达式来分割字符串。javaString text = "apple, banana; orange"; String[] fruits = text.split("[,;\\s]+"); // 按逗号、分号或空白字符分割 // fruits -> ["apple", "banana", "orange"]String replaceAll(String regex, String replacement): 将所有匹配正则表达式的子字符串替换为指定的字符串。javaString text = "My phone number is 123-456-7890."; // 将所有数字替换为 'X' String censored = text.replaceAll("\\d", "X"); // censored -> "My phone number is XXX-XXX-XXXX."
常见正则表达式元字符
| 元字符 | 描述 |
|---|---|
. | 匹配除换行符以外的任何单个字符 |
\d | 匹配一个数字,等同于 [0-9] |
\D | 匹配一个非数字字符 |
\s | 匹配任何空白字符(空格、制表符、换行符等) |
\S | 匹配任何非空白字符 |
\w | 匹配任何单词字符(字母、数字、下划线),等同于 [a-zA-Z_0-9] |
\W | 匹配任何非单词字符 |
\b | 匹配单词边界 |
^ | 匹配输入的开头 |
$ | 匹配输入的结尾 |
* | 匹配前面的元素零次或多次 |
+ | 匹配前面的元素一次或多次 |
? | 匹配前面的元素零次或一次 |
{n} | 匹配前面的元素恰好 n 次 |
{n,} | 匹配前面的元素至少 n 次 |
{n,m} | 匹配前面的元素至少 n 次,但不超过 m 次 |
[] | 字符集,匹配方括号中的任意一个字符。例如 [abc] 匹配 'a', 'b', 或 'c' |
() | 分组,将多个字符作为一个单元,并用于捕获匹配 |
| ` | ` |