einzigartige regex-matcher-Ergebnisse (ohne die Verwendung von Karten oder Listen)
Gibt es eine Möglichkeit um nur die einzigartigen Spiele? ohne Verwendung einer Liste oder auf einer Karte nach dem matching, möchte ich den matcher-Ausgang, einzigartig zu sein, sofort.
Sample-input/output:
String input = "This is a question from [userName] about finding unique regex matches for [inputString] without using any lists or maps. -[userName].";
Pattern pattern = Pattern.compile("\\[[^\\[\\]]*\\]");
Matcher matcher = pattern.matcher(rawText);
while (matcher.find()) {
String tokenName = matcher.group(0);
System.out.println(tokenName);
}
Dieser wird Folgendes ausgegeben:
[userName]
[inputString]
[userName]
Aber ich will es, um die Ausgabe der folgenden:
[userName]
[inputString]
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, es ist. Sie können kombinieren der eine negative lookahead-und Rückverweis:
Wird nur entsprechen, wenn das, was gepaart mit Ihrer tatsächlichen Muster, tritt nicht wieder in den string. Effektiv, das bedeutet, dass Sie immer die letzten auftreten von jedem Spiel, so würde man Sie in einer anderen Reihenfolge:
Wenn der Auftrag ist ein problem für Sie (D. H. wenn es ist entscheidend, um die Ihnen vom ersten auftreten), werden Sie nicht in der Lage, dies zu tun mit regex nur. Sie müssten eine variable-Länge-look*hinter* ist, und dass ist nicht unterstützt von Java.
Weiter Lesen:
Einige Hinweise auf eine Allgemeine Lösung
Hinweis: dies funktioniert mit jedem Muster, deren Spiele sind in der nicht-null-Breite. Die Allgemeine Lösung ist einfach:
(Ich verließ die Doppel-backslash, denn das gilt nur für einige Sprachen.)
Wenn Sie wollen, dass es funktioniert mit Muster, die null-Breite entspricht (weil Sie nur wollen, um zu wissen, eine position und sind mit lookarounds nur aus irgendeinem Grund), Sie könnten dies tun:
Beachten Sie auch, dass (in der Regel), haben Sie vielleicht, um die "singleline" oder "dotall" - option, wenn Sie Ihre Eingabe Zeilenumbrüche enthalten kann (sonst wird die lookahead-Funktion überprüft nur in der aktuellen Zeile). Wenn Sie nicht oder wollen nicht zu aktivieren (weil Sie haben ein Muster, das Fristen, die müssen nicht mit den Zeilenumbrüchen; oder, weil Sie JavaScript verwenden), dies ist die Allgemeine Lösung:
Zu machen, und diese Antwort auch mehr allgemein anwendbar, hier ist, wie könnte man nur übereinstimmungen ersten auftreten von jedem Spiel (in einem Motor mit variabler Länge lookbehinds, wie .NETTO):