2017-03-01 16 views
2

Ich möchte den Text und die spezifische Zeichenkette erhalten, bis sie mit einer anderen übereinstimmt. Ich habe "Anzahl der Türen: 5 Hinter dieser Tür bla bla bla ...Wie man Text zwischen zwei spezifischen Zeichenketten erhält

Anzahl der Türen: 6 Hinter dieser Tür bla bla bla" ich brauche „Türnummer zu erhalten: 5 Hinter dieser Tür bla bla bla ...“

String str = " Door 51 text1 Door 61 text2 Door 10 text3"; 
     Pattern pattern = Pattern.compile("\\s\\bPage\\b\\s\\d+(.*?)\\s\\bPage\\b\\s\\d+"); 
     Matcher matcher = pattern.matcher(str); 
     while (matcher.find()) { 
      System.out.println(matcher.group(1)); 
     } 

Dies ist mein Code, aber ich bekomme nur text1, wenn ich it.I Tür benötigen laufen 51 text1, Tür 61 text2, Tür 10 text3.

+1

Warum spalten nicht nur die Zeichenfolge auf 'Door' spaltete dann die resultierenden Strings nach dem ersten Platz? Konvertiere den ersten Teil in int. Auf diese Weise erhalten Sie etwas wie "[[61," text2 "], [10," text3]]]. Keine Notwendigkeit für Regex. – domsson

Antwort

3

Sie benötigen einen Look-Ahead zu verwenden, anstatt das verzehrende Muster nach (.*?) als die Spiele überlappen sich herausstellen:

\bDoor\s+\d+(.*?)(?=\bDoor\s+\d+|$) 
       ^^^^^^^^^^^^^^^^^^ 

die regex demo See.

Die Vorgriffs-(?=\bDoor\s+\d+|$) wird das Ende der Zeichenkette $ oder Door (als ganzes Wort) erfordern, 1+ Leerzeichen (\s+) und 1+ Ziffern (\d+) nach irgendeinem 0+ Zeichen anders als Zeilenumbruch Zeichen (.*?). Beachten Sie, dass eine Wortgrenze in r\b\s keinen Sinn ergibt, da \s kein Wort char entspricht, also habe ich das Muster ein wenig angepasst.

Java demo:

String str = " Door 51 text1 Door 61 text2 Door 10 text3"; 
Pattern pattern = Pattern.compile("\\bDoor\\s+\\d+(.*?)(?=\\bDoor\\s+\\d+|$)"); 
Matcher matcher = pattern.matcher(str); 
while (matcher.find()) { 
    System.out.println(matcher.group(1)); 
} 

Ein alternative solution mit split:

String str = "Door 51 text1 Door 61 text2 Door 10 text3"; 
String[] doors = str.replaceFirst("^\\s*\\bDoor\\s+\\d+\\s*", "").split("\\s*\\bDoor\\s+\\d+\\s*"); 
System.out.println(Arrays.toString(doors)); 
// = > [text1, text2, text3] 
+1

Danke. Die erste Lösung funktionierte, ich habe nur group() anstelle von group (1) verwendet. – user771

+0

Also, du musst "Doors ..." behalten? Dann können Sie den zweiten Ansatz mit einem Lookahead verwenden - 'String [] doors = str.split (" (? = \\ bDoor \\ s + \\ d +) ");'. Siehe [** diese IDEONE Demo **] (https://ideone.com/R0Npvk). –

Verwandte Themen