2012-03-30 13 views
3

Ich habe einen bestimmten Text in Java, und ich möchte mit Muster und Matcher etwas daraus extrahieren. Das ist mein Programm:Muster/Matcher in Java?

public String getItemsByType(String text, String start, String end) { 

    String patternHolder; 
    StringBuffer itemLines = new StringBuffer(); 

    patternHolder = start + ".*" + end; 

    Pattern pattern = Pattern.compile(patternHolder); 
    Matcher matcher = pattern.matcher(text); 

    while (matcher.find()) { 
     itemLines.append(text.substring(matcher.start(), matcher.end()) 
       + "\n"); 
    } 

    return itemLines.toString(); 
} 

Dieser Code funktioniert voll WHEN der gesuchte Text auf der gleichen Linie ist, zum Beispiel:

String text = "My name is John and I am 18 years Old"; 

getItemsByType(text, "My", "John"); 

sofort packt den Text „Mein Name ist John“ aus dem Text . Wenn jedoch mein Text sieht wie folgt aus:

String text = "My name\nis John\nand I'm\n18 years\nold"; 

getItemsByType(text, "My", "John"); 

Es hat nichts greifen, da „My“ und „John“ auf verschiedenen Linien sind. Wie löse ich das?

+0

Sie sollten 'ändern itemLines.append (text.substring (matcher.start(), matcher.end()) + "\ n");' auf 'itemLines.append (matcher.group()) ; itemLines.append ('\ n'); ' Sie sollten String-Verkettungen nicht mit + durchführen, wenn Sie einen String-Puffer zur Hand haben. Außerdem würde ich StringBuilder anstelle von StringBuffer verwenden. –

Antwort

7

Verwenden Sie stattdessen:

Pattern.compile(patternHolder, Pattern.DOTALL); 

Vom javadoc, die DOTALL Flagge bedeutet:

Aktiviert dotall Modus.

Im Punktmodus der Ausdruck. passt auf ein beliebiges Zeichen, einschließlich eines Zeilenabschlusszeichens. Standardmäßig stimmt dieser Ausdruck nicht mit Zeilenabschlusszeichen überein.

+0

Danke, Sir, das war unglaublich hilfreich! – ZimZim

1

Verwenden Sie Pattern.compile(patternHolder, Pattern.DOTALL), um das Muster zu kompilieren. Auf diese Weise stimmt der Punkt mit dem Zeilenumbruch überein. Standardmäßig wird Newline auf eine spezielle Weise behandelt und nicht mit dem Punkt verglichen.