Matcher
用于对字符串执行正则表达式匹配操作,需配合 Pattern
类使用。
matches()
:完全匹配功能:检查 整个字符串 是否完全匹配正则表达式。
Pattern pattern = Pattern.compile(“a\d+z”);
Matcher matcher = pattern.matcher(“a123z”);
boolean isMatch = matcher.matches();
System.out.println(isMatch); // true(完全匹配)
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
group()
:获取匹配内容功能:返回匹配的子串。
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个捕获组)
}
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
}
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
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
lookingAt()
:部分匹配功能:检查字符串的 起始部分 是否匹配正则表达式。
Pattern pattern = Pattern.compile(“\d+”);
Matcher matcher = pattern.matcher(“123abc”);
boolean isLookingAt = matcher.lookingAt();
System.out.println(isLookingAt); // true(开头是数字)
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]
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
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() |
检查字符串开头是否匹配 | 快速前缀验证 |
注意事项:
find()
、matches()
或 lookingAt()
后,才能使用 group()
、start()
、end()
。group(int)
时,索引从 1
开始(0
表示整个匹配)。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 | 空白字符(空格、制表符等) | (两个空格) |
优先级:
正则表达式按 从左到右 的顺序匹配。例如:
SELECT
会匹配 组1,而非 组2(标识符)。select
(小写)也会匹配 组1(因 (?i)
忽略大小写)。组6 和 组7 的关系:
'abc'
):
'abc'
(包含引号)。abc
(仅内容)。123
),则 组6 和 组7 均为 null
。空白字符(组9):
通常用于词法分析器(Lexer)跳过空白符,不生成有效 Token。