Java Matcher.regionEnd Method
Last modified: April 20, 2025
The Matcher.regionEnd method is part of Java's regex API. It returns
the end index (exclusive) of the current region for this matcher. The region
defines the bounds within which the matcher operates.
Regions are useful when you want to limit pattern matching to a specific portion
of the input sequence. The region starts at regionStart and extends
to regionEnd. By default, the region covers the entire input.
Matcher.regionEnd Basics
The regionEnd method returns the end index of the current matching
region. This is the index after the last character that will be searched. The
method is typically used with regionStart and region.
Changing the region affects all subsequent matching operations. The indices are zero-based, and the end index is exclusive. This means matching stops before reaching the end index.
Basic regionEnd Example
This example demonstrates how to use regionEnd to get the current
region boundary. We'll create a matcher and examine its default region settings.
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());
}
}
}
In this example, we create a matcher with the default region covering the entire
input string. The regionEnd method returns the same value as the
input length. The matcher finds all occurrences of "fox" in the full string.
Setting a Custom Region
Here we'll set a custom region and use regionEnd to verify the new
boundary. The matcher will only search within the specified region.
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());
}
}
}
This example limits the search to the first 10 characters of the input. The
matcher only finds "Java 8" because "Java 11" starts at position 8 but extends
beyond our region end of 10. The regionEnd confirms our boundary.
RegionEnd with Multiple Regions
This example shows how changing regions affects matching behavior. We'll use
regionEnd to verify each region's boundaries.
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());
}
}
}
We demonstrate two different regions in this example. The first region captures
"apple" and "banana". The second region starts in the middle of "banana" and
captures "cherry" and "date". regionEnd helps verify each region's
boundaries.
RegionEnd with Anchors
Region boundaries affect how anchors like ^ and $ behave. This example shows the
interaction between regions and anchors, using regionEnd to confirm
the matching area.
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());
}
}
}
With the full region, the matcher finds "end" at the end of the input. When we
restrict the region to exclude the last line, the anchor no longer matches.
regionEnd helps us understand why the match fails in the second case.
RegionEnd with Reset
The reset method affects the matcher's region. This example shows
how reset changes the region boundaries back to default.
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());
}
}
}
After setting a custom region, reset returns the matcher to its
original state with the region covering the entire input. The
regionEnd value changes accordingly, and subsequent matches scan
the full input string.
RegionEnd with Transparent Bounds
This advanced example demonstrates how useTransparentBounds affects
matching at region boundaries. We'll use regionEnd to track the
region size.
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());
}
}
With opaque bounds (default), the matcher fails because the pattern extends
beyond the region end. With transparent bounds, lookahead/lookbehind can see
beyond the region. regionEnd helps us understand the boundary where
this behavior changes.
RegionEnd Performance Considerations
This example shows how using regions can improve performance by limiting the
search area. We'll use regionEnd to verify our restricted search.
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);
}
}
By restricting the region to the first 100 characters, we avoid scanning the
entire large string. regionEnd confirms our search boundary. This
technique can significantly improve performance when you know the match location.
Source
Java Matcher.regionEnd Documentation
In this tutorial, we've explored the Matcher.regionEnd method and
its role in regex region manipulation. Understanding regions is crucial for
efficient and targeted pattern matching in Java.
Author
List all Java tutorials.