florianingerl / com.florianingerl.util.regex

Java regex library
MIT License
46 stars 5 forks source link

Hang when including extra modifiers in some odd cases #13

Open Col-E opened 1 year ago

Col-E commented 1 year ago

I've been looking to make a regex that tells me how many groups (matching) there are in another given regex and found a pattern that looks like this: image

String pattern = "\\((?!\\?:)[^)(]*+(?:[^)(]*)*+\\)";
String text = "([ \\t]+)(?:\\/\\/[^\\n]*TODO\\b[^\\n]+\\n)(\\/\\/[^\\n]+)?\\n?((\\1)(?2)\\n)*";
Matcher matcher = Pattern.compile(pattern).matcher(text);
matcher.find()

Unfortunately, calling matcher.find() in this case hangs.

Now, if I alter the pattern into \((?!\?:)[^)(]*+(?:[^)(])*+\) I still get the expected matches, and there is no more hang. I know that the behavior of the pattern is technically changed, but I control the input and it still works for all my desired cases. The standard java.util.regex impl seems to handle both cases fine. No biggie since there is a work-around, but any ideas why this hang occurs with the original pattern?

TLDR: \((?!\?:)[^)(]*+(?:[^)(])*+\) - Works \((?!\?:)[^)(]*+(?:[^)(]*)*+\) - Hangs, has one additional *