Using java.util.regex to extract substrings I find myself implementing the same code pattern working around calls to :
Pattern p = Pattern.compile(pattern); // can be static final Matcher m = p.matcher(input); if (m.find()) { // or m.matches() foo(m.group(x)); } else { ... }
Is there a functional extension or popular library (guava / apache commons) that avoids the ugly unnecessary and error-prone local variable, like:
Pattern p = Pattern.compile(pattern); // can be static final p.matchedGroup(input, x) // return Optional<String> .map(group -> foo(group)) .orElse(...);
and also a stream of match results like:
Pattern p = Pattern.compile(pattern); p.findMatches(input) .map((MatchResult mr) -> { mr.groupsIfPresent(x).map(g -> foo(g)).orElse(...) }) .findFirst();
It seems the only functional addition in Java8 was .splitAsStream()
but that only helps when trying to split around matches.
Advertisement
Answer
The following is only available from java-9
You’re probably looking for Matcher::results
which produces a Stream<MatchResult>
You can use it in the following way for example
p.matcher(input) .results() .map(MatchResult::group) .findAny() .orElse(null);
An addition added by Holger and which is intersting would be, while reading a File
and looking for a pattern to directly use Scanner::findAll
to avoid loading the whole file in memory using File::lines