2017-02-15 7 views
2

Ich habe eine Zeichenfolge von Formular "Some lengthy string, Pattern1: string1, Pattern2: string2, Pattern3: string3". Mein Ziel ist es, string1, string2 und string3 aus einer solchen String zu extrahieren.Split String mehrere Muster

Beachten Sie, dass die Strings, Pattern1, Pattern2 und Pattern3 selbst aus mehreren Zeichen bestehen. Ich kenne die Lösung, wenn diese Muster einzelne Zeichen sind. Zur Zeit bin ich gezwungen, mehrere String.split() Anrufe jeweils für Pattern1, Pattern2 und Pattern3 zu tun.

Gibt es eine elegantere Art, dies zu tun? Oder gibt es kein Entkommen mehrere split() Anrufe?

EDIT: Ich suchte oder eine Java-spezifische Lösung (Daher war Java im Titel, aber es wurde bearbeitet). Sowieso. Das habe ich versucht und es scheint für mich zu funktionieren.

String someString = "Some lengthy string Pattern1: string1 Pattern2: string2 Pattern3: string3"; 
String [] str = someString.split("Pattern1:|Pattern2:|Pattern3:"); 
System.out.println(str[1]); 
System.out.println(str[2]); 
System.out.println(str[3]); 

Ausgabe dieser ist

string1 
string2 
string3 

Offensichtliche Probleme mit diesem?

+5

Capturing Gruppen helfen können: [ 'Pattern1 (s?): (.? *) \ S *, \ s * Pattern2: \ s * (. *?), \ s * Muster3: \ s * (. *) "'] (https://regex101.com/r/LA4cts/2) –

Antwort

0

Wie wäre es mit einer String.replaceAll() statt mit Capture-Gruppen?

str.replaceAll(".*(?:Pattern1: ([^,]*))(?:, Pattern2: ([^,]*))(?:, Pattern3: ([^,]*))", "$1;$2;$3").split(";"); 

oder sogar kürzer zu machen, können Sie die Muster entfernen und suchen Sie einfach nach den Doppelpunkte:

str.replaceAll("[^:]*: ([^,]*,?)", "$1").split(","); 
+0

Ich mag das, aber überlege, es zu ändern: '. .., "$ 1; $ 2; $ 3"). Split (";") 'um ein Array anstelle eines einzelnen Zeichenkettenstrings zu erhalten – Bohemian

+0

Modified. Thanks! – Uniphonic

1

Um ein Array Ihrer Ziele zu erhalten, müssen Sie zuerst die Hauptrolle abzustreifen, dann aufgeteilt auf die anderen Muster:

String targets = input.replaceAll("^.*?Pattern1: ", "").split(", (Pattern2|Pattern3): "); 
0

String stringToSearch = "Einige lange Zeichenfolge Pattern1: Zeichenfolge1 Pattern2: Zeichenfolge2 Pattern3: string3";

String REGEX = "Pattern\\w:\\s[\\w]+"; 
Pattern p1 = Pattern.compile(REGEX); 
Matcher m = p1.matcher(stringToSearch); 

Pattern p2 = Pattern.compile(":"); 

while (m.find()) 
{ 
    String[] items = p2.split(m.group()); 
    if(items.length < 2) 
     break; 
    System.out.println(items[1]); 
} 

Ausgang:

Zeichenfolge1 Zeichenfolge2 string3