Ich versuche, die Standardeingabe zu analysieren und jede Zeichenfolge zu extrahieren, die mit einem bestimmten Muster übereinstimmt, zähle die Anzahl der Vorkommen jeder Übereinstimmung und drucke die Ergebnisse alphabetisch. Dieses Problem scheint eine gute Übereinstimmung mit der Streams-API zu sein, aber ich kann keinen übersichtlichen Weg finden, um einen Match-Stream von einem Matcher zu erstellen.Wie erstelle ich einen Stream von Regex-Treffern?
Ich habe dieses Problem gelöst, indem ich einen Iterator über die Übereinstimmungen implementierte und ihn in einen Stream verpackte, aber das Ergebnis ist nicht gut lesbar. Wie kann ich einen Stream von Regex-Matches erstellen, ohne zusätzliche Klassen einzuführen?
public class PatternCounter
{
static private class MatcherIterator implements Iterator<String> {
private final Matcher matcher;
public MatcherIterator(Matcher matcher) {
this.matcher = matcher;
}
public boolean hasNext() {
return matcher.find();
}
public String next() {
return matcher.group(0);
}
}
static public void main(String[] args) throws Throwable {
Pattern pattern = Pattern.compile("[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-][email protected][a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)");
new TreeMap<String, Long>(new BufferedReader(new InputStreamReader(System.in))
.lines().map(line -> {
Matcher matcher = pattern.matcher(line);
return StreamSupport.stream(
Spliterators.spliteratorUnknownSize(new MatcherIterator(matcher), Spliterator.ORDERED), false);
}).reduce(Stream.empty(), Stream::concat).collect(groupingBy(o -> o, counting()))
).forEach((k, v) -> {
System.out.printf("%s\t%s\n",k,v);
});
}
}
in Java 9, wird es eine Methode Matcher sein .Ergebnisse. siehe http://download.java.net/jdk9/docs/api/java/util/regex/Matcher.html#results-- – user140547
sieht aus wie [Java 9 URI hat sich geändert] (http://download.java .net/java/jdk9/docs/api/java/util/regex/Matcher.html # results--) – Gary