Package org.jline.utils
Class SafeRegex
- java.lang.Object
-
- org.jline.utils.SafeRegex
-
public final class SafeRegex extends java.lang.ObjectRegex utilities that guard against catastrophic backtracking (ReDoS).Java's
java.util.regexengine uses backtracking, so patterns with nested quantifiers (e.g.(a+)+b) can take exponential time on non-matching input. This class wraps input in aCharSequencethat enforces a wall-clock deadline, throwingRegexTimeoutExceptionif matching takes too long.Usage:
- For simple boolean checks, use
matches(java.util.regex.Pattern, java.lang.CharSequence)orfind(java.util.regex.Pattern, java.lang.CharSequence)? they catch timeouts and returnfalse. - When you need the
Matcher(e.g. for a find loop or to read match groups), usematcher(java.util.regex.Pattern, java.lang.CharSequence)and catchRegexTimeoutExceptionyourself. - For glob-style patterns (only
*is special), usecompileGlob(java.lang.String)to compile aPatternthat properly escapes literal characters. Note:compileGlobonly builds the pattern; to get timeout protection, pass the result throughmatcher(java.util.regex.Pattern, java.lang.CharSequence),matches(java.util.regex.Pattern, java.lang.CharSequence), orfind(java.util.regex.Pattern, java.lang.CharSequence).
- For simple boolean checks, use
-
-
Method Summary
All Methods Static Methods Concrete Methods Modifier and Type Method Description static java.util.regex.PatterncompileGlob(java.lang.String globPattern)Compile a glob-style pattern into aPattern.static java.util.regex.PatterncompileGlob(java.lang.String globPattern, int flags)Compile a glob-style pattern into aPatternwith the given regex flags.static booleanfind(java.util.regex.Pattern pattern, java.lang.CharSequence input)Test whether the pattern is found anywhere in the input, with timeout protection.static java.util.regex.Matchermatcher(java.util.regex.Pattern pattern, java.lang.CharSequence input)Create aMatcherthat will throwRegexTimeoutExceptionif matching exceeds the default timeout.static java.util.regex.Matchermatcher(java.util.regex.Pattern pattern, java.lang.CharSequence input, long timeoutMs)Create aMatcherthat will throwRegexTimeoutExceptionif matching exceeds the given timeout.static booleanmatches(java.util.regex.Pattern pattern, java.lang.CharSequence input)Test whether the pattern matches the entire input, with timeout protection.
-
-
-
Method Detail
-
matcher
public static java.util.regex.Matcher matcher(java.util.regex.Pattern pattern, java.lang.CharSequence input)Create aMatcherthat will throwRegexTimeoutExceptionif matching exceeds the default timeout.
-
matcher
public static java.util.regex.Matcher matcher(java.util.regex.Pattern pattern, java.lang.CharSequence input, long timeoutMs)Create aMatcherthat will throwRegexTimeoutExceptionif matching exceeds the given timeout. The timeout starts lazily on the first deadline check during matching (not when theMatcheris created), so it measures actual matching time.
-
matches
public static boolean matches(java.util.regex.Pattern pattern, java.lang.CharSequence input)Test whether the pattern matches the entire input, with timeout protection. Returnsfalseon timeout.
-
find
public static boolean find(java.util.regex.Pattern pattern, java.lang.CharSequence input)Test whether the pattern is found anywhere in the input, with timeout protection. Returnsfalseon timeout.
-
compileGlob
public static java.util.regex.Pattern compileGlob(java.lang.String globPattern)
Compile a glob-style pattern into aPattern.Only
*(match any string) and\(escape) are special; every other character is regex-quoted so it matches literally. This is suitable for user-facing wildcard syntax where full regex power is not intended.- Parameters:
globPattern- the glob pattern (e.g."foo*bar")- Returns:
- a compiled regex pattern
-
compileGlob
public static java.util.regex.Pattern compileGlob(java.lang.String globPattern, int flags)Compile a glob-style pattern into aPatternwith the given regex flags.- Parameters:
globPattern- the glob patternflags- regex flags (e.g.Pattern.DOTALL)- Returns:
- a compiled regex pattern
-
-