Java Matcher.end 方法
上次修改时间:2025 年 4 月 20 日
Matcher.end 方法是 Java 正则表达式包的一部分。它返回匹配到的最后一个字符之后的偏移量。此方法对于确定输入字符串中的匹配位置至关重要。
Matcher.end 与 Pattern 和 Matcher 类一起使用。它提供有关正则表达式匹配的精确位置信息。该方法有几个重载版本,适用于不同的用例。
基本定义
Matcher.end 方法返回匹配项最后一个字符后的索引。如果没有尝试或找到匹配项,它会抛出 IllegalStateException。
有两个版本:end 用于整个匹配项,end(int group) 用于特定组。两者对于使用正则表达式进行高级文本处理都至关重要。
Matcher.end 的基本用法
此示例演示了 Matcher.end 的最简单用法。我们将找到句子中某个单词的位置。结束索引有助于确定匹配的结束位置。
package com.zetcode;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MatcherEndBasic {
public static void main(String[] args) {
String text = "The quick brown fox jumps over the lazy dog";
Pattern pattern = Pattern.compile("fox");
Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
System.out.println("Match found from index " + matcher.start() +
" to " + matcher.end());
System.out.println("Matched text: '" +
text.substring(matcher.start(), matcher.end()) + "'");
}
}
}
在此示例中,我们在句子中搜索单词“fox”。找到后,我们打印开始和结束索引。end 方法返回匹配项的最后一个字符之后的位置。
start 和 end 之间的子字符串为我们提供了精确的匹配文本。这对于验证和文本提取任务很有用。
Matcher.end 与组
此示例显示了如何将 end(int group) 与捕获组一起使用。组允许匹配模式的特定部分。可以单独检索组的结束位置。
package com.zetcode;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MatcherEndGroups {
public static void main(String[] args) {
String date = "2025-04-20";
Pattern pattern = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})");
Matcher matcher = pattern.matcher(date);
if (matcher.matches()) {
System.out.println("Full match ends at: " + matcher.end());
System.out.println("Year ends at: " + matcher.end(1));
System.out.println("Month ends at: " + matcher.end(2));
System.out.println("Day ends at: " + matcher.end(3));
}
}
}
在这里,我们使用捕获组解析日期字符串,分别捕获年、月和日。没有参数的 end 方法给出完整的匹配结束位置。
每个编号组的结束位置都可以通过 end(group) 获得。这有助于处理结构化文本,其中不同的部分具有不同的含义。
带有 end 的多个匹配项
此示例演示了查找多个匹配项及其结束位置。重复调用 Matcher.find 方法以查找所有出现的位置。记录每个匹配项的结束位置。
package com.zetcode;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MatcherEndMultiple {
public static void main(String[] args) {
String text = "cat dog cat dog cat";
Pattern pattern = Pattern.compile("cat");
Matcher matcher = pattern.matcher(text);
System.out.println("All 'cat' positions:");
while (matcher.find()) {
System.out.println("Found at " + matcher.start() +
"-" + matcher.end());
}
}
}
该代码查找输入字符串中所有出现的“cat”。对于每个匹配项,它打印开始和结束位置。每次调用 find 方法时,它都会将匹配器移动到下一个匹配项。
此技术对于诸如关键字突出显示或计算文本中特定模式之类的任务很有用。结束位置有助于确定精确的匹配位置。
Matcher.end 与命名组
Java 支持正则表达式中的命名捕获组。此示例显示了如何获取命名组的结束位置。命名组使模式更具可读性。
package com.zetcode;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MatcherEndNamedGroups {
public static void main(String[] args) {
String text = "John:30, Jane:25";
Pattern pattern = Pattern.compile("(?<name>\\w+):(?<age>\\d+)");
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
System.out.println("Full match ends at: " + matcher.end());
System.out.println("Name '" + matcher.group("name") +
"' ends at: " + matcher.end("name"));
System.out.println("Age '" + matcher.group("age") +
"' ends at: " + matcher.end("age") + "\n");
}
}
}
此代码使用命名组处理姓名-年龄对。end(String name) 方法返回每个命名组的结束位置。这使得代码比使用编号组更易于维护。
命名组在具有多个组的复杂模式中特别有用。它们消除了手动计算组号的需要。
使用 Matcher.end 的错误处理
此示例演示了使用 Matcher.end 时的正确错误处理。如果在错误的时间调用该方法,该方法会抛出异常。我们将展示如何避免常见的陷阱。
package com.zetcode;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MatcherEndErrors {
public static void main(String[] args) {
String text = "Sample text";
Pattern pattern = Pattern.compile("missing");
Matcher matcher = pattern.matcher(text);
try {
// Error: no match attempted yet
System.out.println(matcher.end());
} catch (IllegalStateException e) {
System.out.println("Caught exception: " + e.getMessage());
}
if (matcher.find()) {
System.out.println("Match found");
} else {
try {
// Error: no match found
System.out.println(matcher.end());
} catch (IllegalStateException e) {
System.out.println("Caught exception: " + e.getMessage());
}
}
}
}
该代码显示了两个常见的错误场景。首先,在任何匹配操作之前调用 end。其次,在不成功的匹配之后调用它。两者都会抛出 IllegalStateException。
在调用 end 之前,始终检查 find 或 matches 的结果。这可以防止应用程序中的运行时异常。
文本处理中的 Matcher.end
此实际示例显示了如何将 Matcher.end 用于文本处理。我们将从文档中提取所有电子邮件地址并记录它们的位置。
package com.zetcode;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MatcherEndEmailExtraction {
public static void main(String[] args) {
String document = "Contact us at info@example.com or " +
"support@test.org. For sales, email sales@company.com";
Pattern pattern = Pattern.compile("\\b[\\w.%-]+@[\\w.-]+\\.[a-zA-Z]{2,6}\\b");
Matcher matcher = pattern.matcher(document);
System.out.println("Found emails:");
while (matcher.find()) {
System.out.printf("Email: %-20s Position: %3d-%3d%n",
matcher.group(),
matcher.start(),
matcher.end());
}
}
}
该代码使用正则表达式模式扫描文档中的电子邮件地址。对于找到的每个电子邮件,它会打印地址及其在文档中的位置。end 方法有助于确定每个电子邮件的结束位置。
此技术对于文档处理、数据提取和文本分析很有用。了解匹配位置可以实现精确的文本操作。
Matcher.end 与 String.length
此示例将 Matcher.end 与 String.length 进行比较。我们将展示它们在处理字符串时如何相关。结束位置对于子字符串操作至关重要。
package com.zetcode;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MatcherEndLengthComparison {
public static void main(String[] args) {
String text = "The answer is 42";
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
System.out.println("Matched number: " + matcher.group());
System.out.println("Match ends at: " + matcher.end());
System.out.println("String length: " + text.length());
String afterMatch = text.substring(matcher.end());
System.out.println("Text after match: '" + afterMatch + "'");
}
}
}
该代码在字符串中查找一个数字并检查其位置。将 end 位置与完整字符串长度进行比较。然后,我们使用 substring(end()) 提取匹配项之后的文本。
了解匹配位置和字符串长度之间的关系对于文本操作非常重要。结束位置有助于围绕匹配项精确地拆分字符串。
来源
本教程涵盖了 Matcher.end 方法的各个基本方面。从基本用法到高级文本处理,这些示例演示了它在 Java 正则表达式操作中的多功能性。
作者
列出所有Java教程。