2016-09-11 1 views
0

Ich möchte alle Unterzeichenfolgen aus einer Zeichenfolge extrahieren, die in bestimmten Tags enthalten sind. Zum Beispiel, wenn ich eine Eingabezeichenfolge habe, die einige Unterketten in „*“ Tags einschließt:Java RegEx: Extrahieren mehrerer Unterzeichenfolgen aus einer Zeichenfolge

I contain two terms to extract: *first term* and *second term* 

Was ich will bekommen, sind die beiden Teilketten „erste Term“ und „zweiter Begriff“. Ich habe versucht, mit dem folgenden Code:

List<String> matches = new ArrayList<>(); 
Matcher m = Pattern.compile(".*\\*(.*)\\*.*").matcher(inputString); 
while(m.find()){ 
    matches.add(m.group(1)); 
} 

Aber das gibt mir falsche Ergebnisse. Ich habe das API Dokument über die group Methode gelesen, aber um ehrlich zu sein, verstehe ich nicht ganz, was es bedeutet und wie es funktioniert. Ich wäre dankbar, wenn mir jemand sagen könnte, was der beste Weg ist, um alle gewünschten Sub-Strings hier zu sammeln.

Danke!

+0

Verwenden Sie '\\ * (. *?) \\ *', also nicht gierig. – Tunaki

+0

Was bedeutet "gierig"? danke – user3237736

+0

"Gierig" bedeutet, dass, wenn es mehr als eine Möglichkeit gibt, eine Übereinstimmung zu erhalten, die Übereinstimmung mit der größten Anzahl von Zeichen gewählt wird. Wenn Ihre Regex "a. * B" ist und Ihre Eingabezeile "a1111b ... a2222b" lautet, entspricht dies der gesamten Zeichenfolge, da sie die größtmögliche Übereinstimmung für '. *' Auswählt. Wenn Sie das Fragezeichen "a. *? B" hinzufügen, sagen Sie ihm, dass er die Übereinstimmung mit der kleinsten Anzahl von Zeichen auswählen soll. Das würde also "a1111b" entsprechen. – ajb

Antwort

1

Versuchen Sie, den folgenden Ausdruck:

\\*([^\\*]+)\\* 

Die benötigte Teilkette in der ersten Gruppe sein wird.

+3

Sie müssen nicht '*' innerhalb einer Zeichenklasse entkommen. '\\ * ([^ *] +) \\ *' oder '[*] ([^ *] +) [*]' wird reichen. – Andreas

+0

toll, danke euch Leute! aber ich verstehe nicht ganz: Was genau ist jetzt der Unterschied zu meinem Ansatz? Es scheint, dass es die Verwendung der eckigen Klammern ist, aber ich verstehe nicht, warum es notwendig ist? – user3237736

+0

Mit eckigen Klammern können Sie alles außer einem Stern auswählen, da ein Stern die gewünschte Wortgruppe abschließt. Weitere Informationen zu regulären Ausdrücken finden Sie beispielsweise in diesem Artikel auf WikiBooks: https://en.wikibooks.org/wiki/Regular_Expressions/Perl-Compatible_Regular_Expressions und StackOverflow Documentation: http://stackoverflow.com/documentation/regex/topics. –

Verwandte Themen