Java Matcher.regionStart 方法
上次修改时间:2025 年 4 月 20 日
Matcher.regionStart 方法返回当前搜索区域的起始索引。 这是 Java 正则表达式区域功能的一部分。
区域允许您将模式匹配限制到输入的特定部分。 regionStart 方法有助于检查当前区域边界。
Matcher.regionStart 概述
regionStart 方法是一个简单的 getter,它返回一个整数。 这个整数表示当前搜索区域的包含起始索引。
默认情况下,区域跨越整个输入字符串(起始 = 0)。 您可以使用 region 方法更改此设置。 该区域会影响所有匹配操作。
Basic regionStart 示例
此示例演示了 regionStart 的默认行为。 在不设置区域的情况下,它返回 0,表示搜索整个输入。
package com.zetcode;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MatcherRegionStartBasic {
public static void main(String[] args) {
String input = "The quick brown fox jumps over the lazy dog";
Pattern pattern = Pattern.compile("fox");
Matcher matcher = pattern.matcher(input);
System.out.println("Default regionStart: " + matcher.regionStart());
boolean found = matcher.find();
System.out.println("Match found: " + found);
System.out.println("Match start: " + matcher.start());
}
}
输出显示默认区域从索引 0 开始。匹配器在位置 16 找到 "fox"。 在匹配后,regionStart 值不会改变。
设置自定义区域
此示例展示了如何设置自定义区域并验证其起始位置。 我们将搜索限制到输入字符串的一部分。
package com.zetcode;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MatcherRegionCustom {
public static void main(String[] args) {
String input = "The quick brown fox jumps over the lazy dog";
Pattern pattern = Pattern.compile("fox|dog");
Matcher matcher = pattern.matcher(input);
// Set region from index 20 to end
matcher.region(20, input.length());
System.out.println("Custom regionStart: " + matcher.regionStart());
while (matcher.find()) {
System.out.println("Found '" + matcher.group() +
"' at " + matcher.start());
}
}
}
由于区域从 20 开始,匹配器仅找到 "dog"。 较早的 "fox" 位于区域之外。 regionStart 正确报告 20。
带有锚点的区域开始
此示例演示了区域开始如何影响锚点匹配。 当设置区域时,像 ^ 这样的锚点的行为会有所不同。
package com.zetcode;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MatcherRegionAnchors {
public static void main(String[] args) {
String input = "First line\nSecond line\nThird line";
Pattern pattern = Pattern.compile("^.*$", Pattern.MULTILINE);
Matcher matcher = pattern.matcher(input);
// Set region starting at line 2
matcher.region(input.indexOf("Second"), input.length());
System.out.println("Region starts at: " + matcher.regionStart());
while (matcher.find()) {
System.out.println("Match: '" + matcher.group() + "'");
}
}
}
当启用 MULTILINE 时,^ 锚点在区域开始处匹配。 这显示了 regionStart 如何影响锚点行为。 仅匹配区域内的行。
重置区域
此示例演示了如何将区域重置为其默认状态,并验证 regionStart 值是否相应更改。
package com.zetcode;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MatcherRegionReset {
public static void main(String[] args) {
String input = "Sample text for region demonstration";
Pattern pattern = Pattern.compile("text");
Matcher matcher = pattern.matcher(input);
// Set custom region
matcher.region(10, 20);
System.out.println("Custom regionStart: " + matcher.regionStart());
// Reset to default region
matcher.reset();
System.out.println("Reset regionStart: " + matcher.regionStart());
// Verify matching works on full input
System.out.println("Match found: " + matcher.find());
}
}
重置后,regionStart 返回 0。 然后,匹配器可以再次在整个输入字符串中找到匹配项。 重置会清除区域和匹配状态。
带有 LookingAt 的区域开始
此示例展示了 regionStart 如何影响 lookingAt 方法,该方法尝试在区域开始处进行匹配。
package com.zetcode;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MatcherRegionLookingAt {
public static void main(String[] args) {
String input = "Start middle end";
Pattern pattern = Pattern.compile("middle");
Matcher matcher = pattern.matcher(input);
// Set region starting at "middle"
matcher.region(6, input.length());
System.out.println("Region starts at: " + matcher.regionStart());
// lookingAt tries to match at region start
System.out.println("lookingAt: " + matcher.lookingAt());
// Compare with matches (must match entire region)
System.out.println("matches: " + matcher.matches());
}
}
lookingAt 成功,因为它在区域开始处匹配。 matches 失败,因为它需要整个区域匹配。 regionStart 显示匹配开始的位置。
多个区域更改
此示例演示了在匹配操作期间,regionStart 如何随着多个区域调整而变化。
package com.zetcode;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MatcherRegionMultiple {
public static void main(String[] args) {
String input = "123-456-789-012";
Pattern pattern = Pattern.compile("\\d{3}");
Matcher matcher = pattern.matcher(input);
// Initial region
matcher.region(0, 9);
System.out.println("First regionStart: " + matcher.regionStart());
while (matcher.find()) {
System.out.println("Found at: " + matcher.start());
}
// Change region
matcher.region(4, input.length());
System.out.println("\nSecond regionStart: " + matcher.regionStart());
while (matcher.find()) {
System.out.println("Found at: " + matcher.start());
}
}
}
输出显示 regionStart 如何随着每个区域更改而更新。 在每个区域中找到不同的匹配项。 该方法准确地反映了当前的搜索边界。
带有 Hit End 的区域开始
此示例探讨了在部分匹配之后,regionStart 和 hitEnd 方法之间的关系。
package com.zetcode;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MatcherRegionHitEnd {
public static void main(String[] args) {
String input = "partial match: cat";
Pattern pattern = Pattern.compile("category");
Matcher matcher = pattern.matcher(input);
// Set region to include "cat" but not full pattern
matcher.region(14, 17);
System.out.println("regionStart: " + matcher.regionStart());
System.out.println("matches: " + matcher.matches());
System.out.println("hitEnd: " + matcher.hitEnd());
}
}
虽然匹配失败,但 hitEnd 返回 true,因为匹配在区域结束时停止。 regionStart 显示匹配开始的位置。 这对于增量匹配很有用。
来源
本教程深入介绍了 Matcher.regionStart 方法。 理解区域对于 Java 中高效的正则表达式处理至关重要。
作者
列出所有Java教程。