Java Matcher.regionEnd 方法
上次修改时间:2025 年 4 月 20 日
Matcher.regionEnd
方法是 Java 正则表达式 API 的一部分。它返回此匹配器当前区域的结束索引(不包括)。该区域定义了匹配器操作的范围。
当您想将模式匹配限制到输入序列的特定部分时,区域非常有用。该区域从 regionStart
开始,延伸到 regionEnd
。默认情况下,该区域覆盖整个输入。
Matcher.regionEnd 基础
regionEnd
方法返回当前匹配区域的结束索引。这是将被搜索的最后一个字符之后的索引。该方法通常与 regionStart
和 region
一起使用。
更改区域会影响所有后续匹配操作。索引从零开始,并且结束索引不包括在内。这意味着匹配在到达结束索引之前停止。
regionEnd 基本示例
此示例演示如何使用 regionEnd
获取当前区域边界。我们将创建一个匹配器并检查其默认区域设置。
package com.zetcode; import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegionEndBasic { 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); // Get default region end (entire input length) int end = matcher.regionEnd(); System.out.println("Default region end: " + end); System.out.println("Input length: " + input.length()); // Find matches within default region while (matcher.find()) { System.out.println("Found at: " + matcher.start()); } } }
在此示例中,我们创建一个匹配器,其默认区域覆盖整个输入字符串。regionEnd
方法返回与输入长度相同的值。匹配器在完整字符串中查找所有 "fox" 的出现。
设置自定义区域
在这里,我们将设置一个自定义区域,并使用 regionEnd
来验证新的边界。匹配器将仅在指定的区域内搜索。
package com.zetcode; import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegionEndCustom { public static void main(String[] args) { String input = "Java 8, Java 11, Java 17"; Pattern pattern = Pattern.compile("Java \\d+"); Matcher matcher = pattern.matcher(input); // Set custom region (first 10 characters) matcher.region(0, 10); System.out.println("Region start: " + matcher.regionStart()); System.out.println("Region end: " + matcher.regionEnd()); // Find matches within custom region while (matcher.find()) { System.out.println("Found: " + matcher.group()); } } }
此示例将搜索限制为输入的前 10 个字符。匹配器仅找到 "Java 8",因为 "Java 11" 从位置 8 开始,但超出我们 10 的区域结束位置。regionEnd
确认了我们的边界。
带有多个区域的 RegionEnd
此示例显示了更改区域如何影响匹配行为。我们将使用 regionEnd
来验证每个区域的边界。
package com.zetcode; import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegionEndMultiple { public static void main(String[] args) { String input = "apple banana cherry date elderberry"; Pattern pattern = Pattern.compile("[a-z]+"); Matcher matcher = pattern.matcher(input); // First region: first 15 characters matcher.region(0, 15); System.out.println("Region 1 end: " + matcher.regionEnd()); System.out.println("Matches in region 1:"); while (matcher.find()) { System.out.println(matcher.group()); } // Second region: characters 10-25 matcher.region(10, 25); System.out.println("\nRegion 2 end: " + matcher.regionEnd()); System.out.println("Matches in region 2:"); while (matcher.find()) { System.out.println(matcher.group()); } } }
我们在此示例中演示了两个不同的区域。第一个区域捕获 "apple" 和 "banana"。第二个区域从 "banana" 的中间开始,并捕获 "cherry" 和 "date"。regionEnd
帮助验证每个区域的边界。
带有锚点的 RegionEnd
区域边界会影响像 ^ 和 $ 这样的锚点的行为。此示例显示了区域和锚点之间的交互,并使用 regionEnd
来确认匹配区域。
package com.zetcode; import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegionEndAnchors { public static void main(String[] args) { String input = "start\nmiddle\nend"; Pattern pattern = Pattern.compile("^end$", Pattern.MULTILINE); Matcher matcher = pattern.matcher(input); // Full input region System.out.println("Full region end: " + matcher.regionEnd()); System.out.println("Matches in full region:"); while (matcher.find()) { System.out.println("Found at: " + matcher.start()); } // Restricted region (excludes last line) matcher.region(0, input.indexOf("\nend")); System.out.println("\nRestricted region end: " + matcher.regionEnd()); System.out.println("Matches in restricted region:"); while (matcher.find()) { System.out.println("Found at: " + matcher.start()); } } }
使用完整区域,匹配器在输入的末尾找到 "end"。当我们限制区域以排除最后一行时,锚点不再匹配。regionEnd
帮助我们理解为什么匹配在第二种情况下失败。
带有 Reset 的 RegionEnd
reset
方法会影响匹配器的区域。此示例显示了 reset
如何将区域边界更改回默认值。
package com.zetcode; import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegionEndReset { public static void main(String[] args) { String input = "one two three four five"; Pattern pattern = Pattern.compile("\\w+"); Matcher matcher = pattern.matcher(input); // Set custom region matcher.region(4, 12); System.out.println("Custom region end: " + matcher.regionEnd()); // Reset matcher matcher.reset(); System.out.println("After reset, region end: " + matcher.regionEnd()); // Verify matches in default region while (matcher.find()) { System.out.println(matcher.group()); } } }
设置自定义区域后,reset
将匹配器恢复到其原始状态,该区域覆盖整个输入。regionEnd
值会相应更改,并且后续匹配会扫描完整的输入字符串。
带有透明边界的 RegionEnd
此高级示例演示了 useTransparentBounds
如何影响区域边界处的匹配。我们将使用 regionEnd
来跟踪区域大小。
package com.zetcode; import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegionEndTransparent { public static void main(String[] args) { String input = "abcdefghijklmnop"; Pattern pattern = Pattern.compile("defghijk"); Matcher matcher = pattern.matcher(input); // Set region that excludes part of the pattern matcher.region(2, 9); System.out.println("Region end: " + matcher.regionEnd()); // Try matching with opaque bounds (default) System.out.println("With opaque bounds: " + matcher.matches()); // Enable transparent bounds matcher.useTransparentBounds(true); System.out.println("With transparent bounds: " + matcher.matches()); } }
使用不透明边界(默认),匹配器失败,因为模式超出区域结束。使用透明边界,先行/后顾可以看到超出区域。regionEnd
帮助我们理解行为发生变化的边界。
RegionEnd 性能考虑
此示例显示了使用区域如何通过限制搜索区域来提高性能。我们将使用 regionEnd
来验证我们限制的搜索。
package com.zetcode; import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegionEndPerformance { public static void main(String[] args) { // Large input with target near start StringBuilder sb = new StringBuilder(); sb.append("target"); sb.append("x".repeat(100000)); String input = sb.toString(); Pattern pattern = Pattern.compile("target"); Matcher matcher = pattern.matcher(input); // Limit search to first 100 characters matcher.region(0, 100); System.out.println("Restricted region end: " + matcher.regionEnd()); long startTime = System.nanoTime(); boolean found = matcher.find(); long duration = System.nanoTime() - startTime; System.out.println("Found: " + found); System.out.println("Search time (ns): " + duration); } }
通过将区域限制为前 100 个字符,我们避免了扫描整个大字符串。regionEnd
确认了我们的搜索边界。当您知道匹配位置时,此技术可以显著提高性能。
来源
在本教程中,我们探讨了 Matcher.regionEnd
方法及其在正则表达式区域操作中的作用。理解区域对于 Java 中高效且有针对性的模式匹配至关重要。
作者
列出所有Java教程。