Java Matcher.hasTransparentBounds Method
Last modified: April 20, 2025
The hasTransparentBounds
method is part of Java's
java.util.regex.Matcher
class. It checks if transparent bounds
are enabled for pattern matching operations. This setting affects how
boundary matchers behave at region boundaries.
Transparent bounds allow lookahead, lookbehind, and boundary matchers to see beyond the region boundaries when matching. This is useful when you need context outside the current matching region. The default is false.
Basic Definitions
A Matcher
is created from a Pattern
and performs
match operations on a character sequence. The region defines the portion
of the input sequence to be searched. Transparent bounds affect boundary
matching at region edges.
When transparent bounds are enabled, boundary matchers like ^
,
$
, \b
, and \B
can see text outside
the current region. This allows for more flexible matching in some cases.
Checking Default Transparent Bounds
This example shows how to check the default transparent bounds setting. By default, transparent bounds are disabled in a new Matcher instance.
package com.zetcode; import java.util.regex.Matcher; import java.util.regex.Pattern; public class TransparentBoundsDefault { public static void main(String[] args) { Pattern pattern = Pattern.compile("^Java$"); Matcher matcher = pattern.matcher("Java Programming"); // Check default transparent bounds setting boolean hasTransparent = matcher.hasTransparentBounds(); System.out.println("Default transparent bounds: " + hasTransparent); // Try to match with default settings boolean matches = matcher.matches(); System.out.println("Matches with default bounds: " + matches); } }
In this example, we create a simple pattern that matches the exact string "Java". The matcher is created with input "Java Programming". By default, transparent bounds are false, so the anchors ^ and $ match the entire input, not just the region.
Enabling Transparent Bounds
This example demonstrates how to enable transparent bounds using the
useTransparentBounds
method and then check the setting with
hasTransparentBounds
.
package com.zetcode; import java.util.regex.Matcher; import java.util.regex.Pattern; public class EnableTransparentBounds { public static void main(String[] args) { Pattern pattern = Pattern.compile("\\bJava\\b"); Matcher matcher = pattern.matcher("Learning Java Programming"); // Set a region that excludes the word "Java" matcher.region(0, 8); // "Learning " // Enable transparent bounds matcher.useTransparentBounds(true); // Verify transparent bounds are enabled System.out.println("Transparent bounds enabled: " + matcher.hasTransparentBounds()); // Attempt to find the word boundary boolean found = matcher.find(); System.out.println("Word boundary found: " + found); } }
Here we set a region that excludes our target word "Java". With transparent bounds enabled, the word boundary matcher \b can see beyond the region. This allows it to properly match the boundary even though "Java" is outside the current region.
Transparent Bounds with Anchors
This example shows how transparent bounds affect anchor matching at region boundaries. Anchors like ^ and $ behave differently with transparent bounds.
package com.zetcode; import java.util.regex.Matcher; import java.util.regex.Pattern; public class TransparentBoundsAnchors { public static void main(String[] args) { String input = "Start Middle End"; Pattern pattern = Pattern.compile("^Middle$"); Matcher matcher = pattern.matcher(input); // Set region to "Middle" matcher.region(6, 12); // Without transparent bounds System.out.println("Without transparent bounds:"); boolean matches = matcher.matches(); System.out.println("Matches: " + matches); // With transparent bounds matcher.useTransparentBounds(true); System.out.println("\nWith transparent bounds:"); matches = matcher.matches(); System.out.println("Matches: " + matches); System.out.println("Has transparent bounds: " + matcher.hasTransparentBounds()); } }
Without transparent bounds, the anchors ^ and $ match the region boundaries. With transparent bounds enabled, they match the actual input boundaries. This shows how transparent bounds affect anchor matching behavior at region edges.
Transparent Bounds with Lookaround
This example demonstrates how transparent bounds affect lookahead and lookbehind assertions at region boundaries. These assertions can see beyond the region when transparent bounds are enabled.
package com.zetcode; import java.util.regex.Matcher; import java.util.regex.Pattern; public class TransparentBoundsLookaround { public static void main(String[] args) { String input = "Prefix123Suffix"; Pattern pattern = Pattern.compile("(?<=Prefix)\\d+(?=Suffix)"); Matcher matcher = pattern.matcher(input); // Set region to exclude the prefix and suffix matcher.region(6, 9); // "123" // Without transparent bounds System.out.println("Without transparent bounds:"); boolean found = matcher.find(); System.out.println("Found: " + found); // With transparent bounds matcher.useTransparentBounds(true); System.out.println("\nWith transparent bounds:"); found = matcher.find(); System.out.println("Found: " + found); System.out.println("Has transparent bounds: " + matcher.hasTransparentBounds()); } }
The lookbehind (?<=Prefix) and lookahead (?=Suffix) assertions fail without transparent bounds because they can't see beyond the region. When transparent bounds are enabled, they can see the surrounding text and the match succeeds.
Combining with Opaque Bounds
This example shows how to combine transparent bounds with opaque bounds for different matching scenarios. Opaque bounds prevent lookaround from seeing beyond the region.
package com.zetcode; import java.util.regex.Matcher; import java.util.regex.Pattern; public class TransparentVsOpaqueBounds { public static void main(String[] args) { String input = "Before123After"; Pattern pattern = Pattern.compile("\\d+(?=After)"); Matcher matcher = pattern.matcher(input); // Set region to exclude "After" matcher.region(0, 9); // "Before123" // First with transparent bounds matcher.useTransparentBounds(true); System.out.println("With transparent bounds:"); boolean found = matcher.find(); System.out.println("Found: " + found); System.out.println("Has transparent bounds: " + matcher.hasTransparentBounds()); // Then with opaque bounds matcher.useTransparentBounds(false); System.out.println("\nWith opaque bounds:"); found = matcher.find(); System.out.println("Found: " + found); System.out.println("Has transparent bounds: " + matcher.hasTransparentBounds()); } }
With transparent bounds, the lookahead (?=After) can see beyond the region and the match succeeds. With opaque bounds (transparent bounds false), the lookahead fails because it can't see the "After" text outside the region.
Region Boundaries with Word Boundaries
This example demonstrates how transparent bounds affect word boundary matching at region boundaries. Word boundaries behave differently based on this setting.
package com.zetcode; import java.util.regex.Matcher; import java.util.regex.Pattern; public class TransparentBoundsWordBoundaries { public static void main(String[] args) { String input = "Java Programming"; Pattern pattern = Pattern.compile("\\bProgramming\\b"); Matcher matcher = pattern.matcher(input); // Set region to exclude the word "Programming" matcher.region(0, 5); // "Java " // With transparent bounds matcher.useTransparentBounds(true); System.out.println("With transparent bounds:"); boolean found = matcher.find(); System.out.println("Found: " + found); System.out.println("Has transparent bounds: " + matcher.hasTransparentBounds()); // Without transparent bounds matcher.useTransparentBounds(false); System.out.println("\nWithout transparent bounds:"); found = matcher.find(); System.out.println("Found: " + found); } }
With transparent bounds enabled, the word boundary \b can see that "Programming" is outside the region but still a valid word. Without transparent bounds, the matcher doesn't find the word boundary correctly because it can't see beyond the region.
Practical Use Case
This example shows a practical use case for transparent bounds when processing text in chunks while maintaining context awareness across chunk boundaries.
package com.zetcode; import java.util.regex.Matcher; import java.util.regex.Pattern; public class TransparentBoundsPractical { public static void main(String[] args) { String largeText = "First paragraph.\n\nSecond paragraph.\n\nThird."; Pattern pattern = Pattern.compile("(?m)^\\w+"); Matcher matcher = pattern.matcher(largeText); // Process text in chunks int chunkSize = 20; for (int i = 0; i < largeText.length(); i += chunkSize) { int end = Math.min(i + chunkSize, largeText.length()); matcher.region(i, end); matcher.useTransparentBounds(true); System.out.println("\nProcessing region: " + i + "-" + end); while (matcher.find()) { System.out.println("Found word at start of line: " + matcher.group()); } System.out.println("Has transparent bounds: " + matcher.hasTransparentBounds()); } } }
This example processes a large text in chunks while using transparent bounds to properly handle line start anchors (^) at region boundaries. This ensures we correctly find words at the start of lines even when those lines are split across chunk boundaries.
Source
Java Matcher.hasTransparentBounds Documentation
In this tutorial, we've explored the hasTransparentBounds
method
and its effects on pattern matching. Understanding this feature is crucial for
advanced regex operations where region boundaries and context awareness matter.
Author
List all Java tutorials.