2012-07-25 13 views
15

Formatter nesnesinde veya String.format() nesnesinde %n kullanılarak yeni satır elde edildiğinde yeni satır içeren bir Dizgi eşleştiremiyorum. Aşağıdaki programda bir göz edin:Düzenli ifade, Biçimlendirici nesnesinden alınan satırsonuyla eşleşmiyor

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)); 
    } 

} 

ve çıkışı:

Hallo 
next line: true 
Hallo 
next line: false 

Burada neler oluyor? İkinci dizge neden uyuşmuyor?

Java sürümü 1.6.0_21'dir.

cevap

43

Pattern.DOTALL bayrağını . eşleme yeni satırlarına ayarlamak için varsayılan olarak ayarlamazsınız. (?s) notasyonu ile yapılır. , \n LF ise, Java, Windows'ta

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

O zaman neden ilk maçı (Ben pencerelerde değilim) yok ? – Axel

+1

Ayrıca, '\ n' ve' \ r \ n' eşleşmesi için '[\ r \ n]' parçasını '\ r? \ N' olarak değiştirmek isteyebilirsiniz. – Keppil

+2

Sadece öğrendim. Pencerelerde, satır sonu "\ r \ n" şeklindedir. Input1'de '\ n' bir satır sonu olarak kabul edilmez ve dolayısıyla normal ifadeler eşleşir. – Axel

9

\r CR ve %n CRLF geçerli: Yani, bu regex istediğini yapar. Modeliniz ikincisiyle uyuşmuyor.

Java 8'den itibaren, herhangi bir satır sonu sırasına uyacak şekilde düzenli ifadelerde \R kullanabilirsiniz.

Linebreak eşleştirici

\R Herhangi Unicode linebreak dizisi olan eşdeğer

\u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029] Örnek:

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

Evet, ". * \ R? \ N. *" Çalışır, ancak birden çok satır kesmesi varsa işe yaramıyor. Şimdi kullanıyorum "(? S). * [\ N \ r]. *". – Axel