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教程。