In Java versuche ich, alle Regex-Übereinstimmungen an ein Array zurückzugeben, aber anscheinend können Sie nur überprüfen, ob das Muster mit etwas übereinstimmt oder nicht (Boolescher Wert).
Wie kann ich eine Regex-Übereinstimmung verwenden, um ein Array aller Zeichenfolgen zu bilden, die mit einem Regex-Ausdruck in einer bestimmten Zeichenfolge übereinstimmen?
Antworten:
( Die Antwort von 4castle ist besser als die folgende, wenn Sie Java> = 9 annehmen können.)
Sie müssen einen Matcher erstellen und diesen verwenden, um iterativ Übereinstimmungen zu finden.
Danach
allMatches
enthält es die Übereinstimmungen, und Sie können verwendenallMatches.toArray(new String[0])
, um ein Array zu erhalten, wenn Sie wirklich eines benötigen.Sie können auch Hilfsfunktionen
MatchResult
schreiben, um Übereinstimmungen zu durchlaufen, daMatcher.toMatchResult()
eine Momentaufnahme des aktuellen Gruppenstatus zurückgegeben wird.Zum Beispiel können Sie einen faulen Iterator schreiben, damit Sie dies tun können
indem Sie so etwas tun:
Mit diesem,
ergibt
quelle
ArrayList
undLinkedList
die Ergebnisse können überraschend sein.allMatches
vsyourStringHere.length()
), können Sie wahrscheinlich eine gute Größe für berechnenallMatches
. Nach meiner ErfahrungLinkedList
lohnen sich die Kosten für Speicher und Iterationseffizienz normalerweiseLinkedList
nicht, ebenso wie meine Standardhaltung. Bei der Optimierung eines Hotspots lohnt es sich jedoch auf jeden Fall, Listenimplementierungen auszutauschen, um festzustellen, ob Sie eine Verbesserung erzielen.Matcher#results
bekommen eine ,Stream
die ein Array zu erzeugen , verwenden können (siehe meine Antwort ).In Java 9 können Sie jetzt eine verwenden
Matcher#results()
, mitStream<MatchResult>
der Sie eine Liste / ein Array von Übereinstimmungen abrufen können.quelle
Java macht Regex zu kompliziert und folgt nicht dem Perl-Stil. Schauen Sie sich MentaRegex an, um zu sehen, wie Sie dies in einer einzigen Zeile Java-Code erreichen können:
quelle
Hier ist ein einfaches Beispiel:
(Wenn Sie mehr Erfassungsgruppen haben, können Sie diese anhand ihres Index als Argument der Gruppenmethode bezeichnen. Wenn Sie ein Array benötigen, verwenden Sie
list.toArray()
)quelle
Pattern.matches()
ist eine statische Methode, die Sie nicht für einePattern
Instanz aufrufen sollten .Pattern.matches(regex, input)
ist einfach eine Abkürzung fürPattern.compile(regex).matcher(input).matches()
.Von dem offiziellen Regex Java Trails :
Verwenden Sie
find
das Ergebnis und fügen Sie esgroup
in Ihr Array / Ihre Liste / was auch immer ein.quelle
quelle