java整则表达式Matcher类核心方法的用法&案例说明

Matcher 用于对字符串执行正则表达式匹配操作,需配合 Pattern 类使用。


1. matches():完全匹配

功能:检查 整个字符串 是否完全匹配正则表达式。

Pattern pattern = Pattern.compile(“a\d+z”);
Matcher matcher = pattern.matcher(“a123z”);

boolean isMatch = matcher.matches();
System.out.println(isMatch); // true(完全匹配)


2. find():查找子串

功能:在字符串中查找 下一个匹配的子串

Pattern pattern = Pattern.compile(“\d+”);
Matcher matcher = pattern.matcher(“a12b34c56”);

while (matcher.find()) {
System.out.println("Found: " + matcher.group());
}
// 输出:
// Found: 12
// Found: 34
// Found: 56


3. group():获取匹配内容

功能:返回匹配的子串。

(1) group()

Pattern pattern = Pattern.compile(“(\d+)-(\d+)”);
Matcher matcher = pattern.matcher(“123-456”);

if (matcher.find()) {
System.out.println(matcher.group()); // 123-456(整个匹配)
System.out.println(matcher.group(1)); // 123(第1个捕获组)
System.out.println(matcher.group(2)); // 456(第2个捕获组)
}

(2) 命名捕获组

Pattern pattern = Pattern.compile(“(?\d{4})-(?\d{2})”);
Matcher matcher = pattern.matcher(“2023-10”);

if (matcher.find()) {
System.out.println(matcher.group(“year”)); // 2023
System.out.println(matcher.group(“month”)); // 10
}


4. start()end():获取位置

功能:返回匹配子串的起始和结束索引。

Pattern pattern = Pattern.compile(“cat”);
Matcher matcher = pattern.matcher(“The cat and another cat.”);

while (matcher.find()) {
System.out.printf(“Found at [%d, %d): %s\n”,
matcher.start(), matcher.end(), matcher.group());
}
// 输出:
// Found at [4, 7): cat
// Found at [17, 20): cat


5. replaceAll()replaceFirst():替换

功能:替换匹配的子串。

Pattern pattern = Pattern.compile(“\d+”);
Matcher matcher = pattern.matcher(“a12b34c56”);

String replacedAll = matcher.replaceAll(“#”);
System.out.println(replacedAll); // a#b#c#

String replacedFirst = matcher.replaceFirst(“#”);
System.out.println(replacedFirst); // a#b34c56


6. lookingAt():部分匹配

功能:检查字符串的 起始部分 是否匹配正则表达式。

Pattern pattern = Pattern.compile(“\d+”);
Matcher matcher = pattern.matcher(“123abc”);

boolean isLookingAt = matcher.lookingAt();
System.out.println(isLookingAt); // true(开头是数字)


7. appendReplacement()appendTail():流式替换

功能:逐步构建替换后的字符串。

Pattern pattern = Pattern.compile(“\d+”);
Matcher matcher = pattern.matcher(“a12b34c56”);

StringBuffer sb = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sb, “[” + matcher.group() + “]”);
}
matcher.appendTail(sb);

System.out.println(sb.toString()); // a[12]b[34]c[56]


8. usePattern():动态切换正则

功能:在运行时更换正则表达式。

Pattern pattern1 = Pattern.compile(“\d+”);
Matcher matcher = pattern1.matcher(“a12b34c56”);

matcher.find();
System.out.println(matcher.group()); // 12

matcher.usePattern(Pattern.compile(“[a-z]+”));
matcher.find();
System.out.println(matcher.group()); // a


9. region():限定匹配范围

功能:限制匹配操作的字符范围。

Pattern pattern = Pattern.compile(“cat”);
Matcher matcher = pattern.matcher(“cat in the cathedral”);

matcher.region(5, 15); // 只在索引 [5,15) 范围内匹配
while (matcher.find()) {
System.out.println(matcher.group()); // “cat”(来自 “cathedral”)
}


总结

方法 功能 典型场景
matches() 检查整个字符串是否完全匹配 验证输入格式(如邮箱)
find() 查找下一个匹配的子串 提取字符串中的特定模式
group() 获取匹配内容或捕获组 解析结构化文本(如日志)
start()/end() 获取匹配位置的索引 高亮显示匹配文本
replaceAll() 替换所有匹配的子串 批量文本替换
appendReplacement() 流式构建替换结果 复杂替换逻辑
lookingAt() 检查字符串开头是否匹配 快速前缀验证

注意事项

  1. 调用 find()matches()lookingAt() 后,才能使用 group()start()end()
  2. 使用 group(int) 时,索引从 1 开始(0 表示整个匹配)。
  3. appendReplacement() 需配合 appendTail() 完成最终字符串构建。

举例说明

正则表达式: (?i)(SELECT|FROM|WHERE)|([a-zA-Z_][a-zA-Z0-9_])|(*)|(,)|(=)|(‘([^’])')|(\d+)|(\s+)

总捕获组数量

正则表达式中共定义了 9 个捕获组,编号为 组1组9。以下是每个组的详细说明:


各捕获组含义

组号 匹配内容 示例
组1 SQL 关键字(SELECT/FROM/WHERE),不区分大小写 SELECT, from, Where
组2 标识符(列名、表名等) users, column_1
组3 星号 * *
组4 逗号 , ,
组5 等号 = =
组6 单引号包裹的完整字符串(含引号) 'hello'
组7 单引号内的内容(不含引号) hello(来自 'hello'
组8 整数 123, 456
组9 空白字符(空格、制表符等) (两个空格)

关键说明

  1. 优先级
    正则表达式按 从左到右 的顺序匹配。例如:

    • SELECT 会匹配 组1,而非 组2(标识符)。
    • select(小写)也会匹配 组1(因 (?i) 忽略大小写)。
  2. 组6 和 组7 的关系

    • 当匹配单引号字符串时(如 'abc'):
      • 组6 的值为 'abc'(包含引号)。
      • 组7 的值为 abc(仅内容)。
    • 若未匹配到字符串(如 123),则 组6组7 均为 null
  3. 空白字符(组9)
    通常用于词法分析器(Lexer)跳过空白符,不生成有效 Token。

你可能感兴趣的:(java,开发语言)