2017-04-20 5 views
1

Ich versuche, die gesamte Ausgabe aus einem String zu bekommen, dass ich ein Muster mit Matcher übereinstimmen soll, aber ich bin nicht sicher, dass entweder die Zeichenfolge oder meine Muster nicht korrekt ist. Ich versuche, (Server: switch) als das erste Muster und so weiter und so weiter nach dem Zeilenumbruch zu bekommen, jedoch bekomme ich nur die letzten drei Muster, wie meine Ausgabe zeigt. Meine Ausgabe ist die folgende mit dem Code folgendeRegExpr Ausgang falsche

found_m: Message: Mess                               
found_m: Token: null                                
found_m: Response: OK 

Hier ist mein Code:

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class RegexMatches { 

    public static void main(String args[]) { 
     // String to be scanned to find the pattern. 
     String line = "Server: Switch\nMessage: Mess\nToken: null\nResponse: OK"; 
     String pattern = "([\\w]+): ([^\\n]+)"; 

     // Create a Pattern object 
     Pattern r = Pattern.compile(pattern); 

     // Now create matcher object. 
     Matcher m = r.matcher(line); 
     if (m.find()) { 
     while(m.find()) { 
      System.out.println("found_m: " + m.group()); 
     } 
     }else { 
     System.out.println("NO MATCH"); 
     } 
    } 
} 

Ist meine Zeichenfolge Linie falsch oder meine Bespannbild, dass ich tue, nicht RegExpr falsch?

Vielen Dank im Voraus.

Antwort

2

Ihre regex ist fast richtig.

Problem ist, dass Sie find zweimal anrufen: 1. Mal in if Zustand und dann wieder in while.

Sie können do-while Schleifen verwenden statt:

if (m.find()) { 
    do { 
     System.out.println("found_m: " + m.group()); 
    } while(m.find()); 
} else { 
    System.out.println("NO MATCH"); 
} 

Für regex Teil können Sie dies mit geringfügiger Korrektur verwenden:

final String pattern = "(\\w+): ([^\\n]+)"; 

oder wenn Sie nicht 2 brauchen einfangenden Gruppen dann verwenden:

final String pattern = "\\w+: [^\\n]+"; 

Da es keine Notwendigkeit gibt, die Zeichenklasse umzu verwenden

0

Ich bin nicht vertraut mit Java, aber das RegexMuster sollte jede Gruppe und Spiel zu erfassen arbeiten.

([\w]+): (\w+)(?:(?:[\\][n])|$) 

Darin heißt es im Grunde das Wort durch den Doppelpunkt und ein Leerzeichen erfassen, dann fangen das nächste Wort, bevor entweder die \ n oder das Ende der Zeichenfolge.

Viel Glück.