2016-08-09 77 views
0

Ich habe die folgende Zeichenfolge aufzuteilen:Wie bestimmte Zeile mit regulären Ausdruck

"body":"The Example 1",(sample),{sample},"sample",&sample,"body":"The Example 2",(sample),{sample},"sample",&sample 

Von oben Zeichenfolge, ich brauche

  • "The Example 1" in variable string1
  • "The Example 2" in variable string2
  • zu extrahieren

ich den folgenden Code bin mit

Pattern comment1 = Pattern.compile("(?<=\")(?:\\\\.|([\"body\"]))*(?=\")", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE | Pattern.DOTALL | Pattern.MULTILINE); 
Matcher matchComm = comment1.matcher(responce.toString()); 

ich immer korrekte Ergebnisse nicht bin.

+0

Warum versuchen Sie es einen umgekehrten Schrägstrich übereinstimmen? ("\\\\") – RealSkeptic

+0

im passenden Anführungszeichen "" weil den Körper identifizieren –

Antwort

3

Dies würde den Trick:

(?<=:")((?=",|"$)|.)+ 
  • (?<=:") ist ein possetive Blick hinter für :".
  • (?=",|"$) ist eine possetive Vorschau für ", oder "$ wo $ das Ende der Zeile/Datei markiert.

Demo: https://regex101.com/r/qT4oO6/2

EDIT1:

Der folgende Code verwendet werden könnte, um eine Anordnung zu erzeugen, wobei jede Position in der Anordnung ein separates Spiel aus der Eingabezeichenfolge ist.

String input = PUT YOUR STRING HERE!; 
String pattern = "(?<=:\")((?=",|\"$)|.)+"; 
ArrayList<String> out = new ArrayList<String>(); 
Pattern p = Pattern.compile(pattern, Pattern.MULTILINE); 
Matcher m = p.matcher(input); 

while(m.find()){ 
    out.add(m.group()); 
} 

EDIT2:

Da Sie nach dem Schreiben die Frage geklärt, dass Sie tatsächlich die Zeichenfolge nach dem „body“ -Tag, die folgende Regex erforderlich wäre, anstatt nur mach wollte:

(?<="body":")((?=",|"$)|.)+ 

Auch wenn das Feld nach dem "body" -Tag leer sein darf, sollte + gegen einen *:

getauscht werden
(?<="body":")((?=",|"$)|.)* 
+0

danke bro und wie kann ich 2 Ausgaben separat so zuweisen "String str1 = erster Ausgang String str 2 = zweiter Ausgang' –

+0

@VinuVish Versuchen Sie das :) – Olian04

+0

als-du so viel @ Olian04 –

1

Ich denke, Sie könnten mit einer besseren Regex (keine Lookbehinds/Lookaheads) tun. Fügen Sie (?i) hinzu, um Groß- und Kleinschreibung zu vermeiden.

public static void main(String[] args) { 
    String s = "\"body\":\"The Example 1\",\"body\":\"The Example 2\""; 
    Pattern p = Pattern.compile("\"body\":\"(.*?)\""); // Capture everything after "body" 
    Matcher m = p.matcher(s); 
    while(m.find()) { 
     System.out.println(m.group(1)); 
    } 
} 

O/P:

The Example 1 
The Example 2 
+0

Danke für die Antwort, wenn die Zeichenfolge wie folgt ist, was wir tun sollten "body": "Beispiel 1", (Beispiel), {Beispiel}, "Beispiel", & Beispiel, "body": "The Beispiel 2 " –

+0

Dies würde die Regex auf nur Zielwerte beschränken, die einen" body "-Abschnitt durchlaufen. Obwohl im Code gezeigt, wurde dies nie als Kriterium in der Frage ausgedrückt. – Olian04

+0

@VinuVish - Wollen Sie nur Daten, die dem Teil "body" folgen? – TheLostMind