前端视角 Java Web 入门手册 3.1:常用工具——正则表达式

100 阅读2分钟

正则表达式 (Regular Expression) 是一种匹配和处理文本的强大工具,可以用来描述文本的模式,从而进行搜索、替换、分割等操作,Java 正则表达式的规则和 JavaScript 规则 几乎一致

基本使用

Java 提供了 java.util.regex 包来支持正则表达式的操作,主要是用 PatternMatcher

  • 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"
}