正则表达式 (Regular Expression) 是一种匹配和处理文本的强大工具,可以用来描述文本的模式,从而进行搜索、替换、分割等操作,Java 正则表达式的规则和 JavaScript 规则 几乎一致
基本使用
Java 提供了 java.util.regex 包来支持正则表达式的操作,主要是用 Pattern 和 Matcher 类
- Pattern 类用于表示编译后的正则表达式。在使用正则表达式之前,需要先将其编译成 Pattern 对象,这样可以提高匹配效率
- Matcher 类用于对输入的字符序列进行匹配操作,它提供了一系列方法来查找、替换和分割字符串
Pattern p = Pattern.compile("[a-z]{3}", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher("aBc");
// matches()方法会将整个字符串与模板进行匹配
System.out.println(m.matches()); // true
// 不考虑可以简写为
System.out.println(Pattern.matches("[a-z]{3}", "abc")); // true
// 也可以直接调用字符串的 matches 方法
System.out.println("abc".matches("[a-z]{3}")); // true
多次匹配遍历
- find():从当前位置判断字符串中是否有子字符串匹配正则表达式,每次调用指针向后移动
- group():返回当前匹配的子字符串
- start():返回当前匹配子字符串的开始下标
- end():返回当前匹配子字符串的结束下标
- reset():重置 find() 指针到字符串开头
String str = "ab3cde123f009gh";
Pattern p = Pattern.compile("\d+");
Matcher m = p.matcher(str);
while (m.find()) {
System.out.println("匹配到字符串:" + m.group() +
",开始下标:" + m.start() +
",结束下标:" + m.end());
}
输出结果
匹配到字符串:3,开始下标:2,结束下标:3
匹配到字符串:123,开始下标:6,结束下标:9
匹配到字符串:009,开始下标:10,结束下标:13
替换查找到的指定字符串
无差别的替换使用 String 类的 replaceAll() 即可
String str = "I like Java. Do you like java or java web?";
String regex = "(?i)java";
String result = str.replaceAll(regex, "JavaScript");
System.out.println(result);
当需要对输入字符串中的匹配部分进行复杂替换,并且希望保留未匹配部分的原始顺序和内容时,Matcher 类的appendReplacement
非常有用。例如可能需要在替换匹配项的同时添加额外的文本,或者根据匹配的不同情况进行不同的替换操作。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class AppendReplacementSimpleExample {
public static void main(String[] args) {
// 定义正则表达式,匹配所有数字
String regex = "\d+";
Pattern pattern = Pattern.compile(regex);
// 输入字符串
String input = "abc123def456ghi";
Matcher matcher = pattern.matcher(input);
StringBuffer buffer = new StringBuffer();
while (matcher.find()) {
// 将匹配到的数字替换为 "X"
matcher.appendReplacement(buffer, "X");
}
// 追加最后一次匹配位置到字符串末尾的部分
matcher.appendTail(buffer);
System.out.println(buffer.toString());
}
}
捕获分组
group() 不传入参数返回当前匹配内容,传入 int 参数返回对应分组内容
从 1 开始计数
String text = "Hello, world!";
Pattern pattern = Pattern.compile("(\w+), (\w+)!");
Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
String firstWord = matcher.group(1); // 获取第一个分组的匹配结果,即 "Hello"
String secondWord = matcher.group(2); // 获取第二个分组的匹配结果,即 "world"
}