2012-07-25 2 views
15

Ich kann keinen String mit Zeilenvorschübe abgleichen, wenn der Zeilenumbruch mithilfe von %n in Formatter Objekt oder String.format() abgerufen wird. Bitte werfen Sie einen Blick auf das folgende Programm:Regulärer Ausdruck stimmt nicht mit newline überein, die vom Formatter-Objekt erhalten wurde

public class RegExTest { 

    public static void main(String[] args) { 
    String input1 = String.format("Hallo\nnext line"); 
    String input2 = String.format("Hallo%nnext line"); 
    String pattern = ".*[\n\r].*"; 
    System.out.println(input1+": "+input1.matches(pattern)); 
    System.out.println(input2+": "+input2.matches(pattern)); 
    } 

} 

und seine Ausgabe:

Hallo 
next line: true 
Hallo 
next line: false 

Was ist hier los? Warum stimmt die zweite Zeichenfolge nicht überein?

Java-Version ist 1.6.0_21.

Antwort

43

Sie können das Flag Pattern.DOTALL so einstellen, dass . mit Zeilenumbrüchen übereinstimmt, standardmäßig nicht. Es ist mit der Notation (?s) gemacht. Also, das regex tut, was Sie wollen:

String pattern = "(?s).*[\n\r].*"; 
+0

Dann warum das erste Spiel (ich bin Fenster) ? – Axel

+1

Sie können auch den '[\ r \ n]' Part zu '\ r? \ N' wechseln, um sowohl' \ n' als auch '\ r \ n' zu finden. – Keppil

+2

Gerade herausgefunden. Unter Windows ist Zeilenende "\ r \ n". Das '\ n' in' input1' wird nicht als Zeilenende betrachtet und daher stimmt die Regex überein. – Axel

9

Unter Windows in Java, \n LF ist, \r CR und %n ist CRLF. Ihr Muster stimmt nicht mit Letzterem überein.

Ab Java 8 können Sie jetzt \R in regulären Ausdrücken verwenden, um eine beliebige Zeilenende-Sequenz zu finden.

Linebreak Matcher

\R Jede Sequenz Unicode Zeilenumbrüche, entspricht \u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]

Beispiel:

String pattern = ".*\\R.*"; 
String.format("Hallo\nnext line").matches(pattern); // true 
String.format("Hallo%nnext line").matches(pattern); // true 
String.format("Hallo same line").matches(pattern); // false 
+0

Ja, ". * \ R? \ N. *" Funktioniert, aber nicht, wenn es mehrere Zeilenumbrüche gibt. Ich verwende jetzt "(? S). * [\ N \ r]. *". – Axel

Verwandte Themen