2012-07-25 12 views
15

Non riesco a trovare una stringa che contiene newline quando la nuova riga viene ottenuta utilizzando %n nell'oggetto Formatter o String.format(). Si prega di dare un'occhiata al seguente programma:L'espressione regolare non corrisponde a newline ottenuta dall'oggetto Formatter

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

} 

e la sua uscita:

Hallo 
next line: true 
Hallo 
next line: false 

cosa sta succedendo qui? Perché la seconda stringa non corrisponde?

La versione di Java è 1.6.0_21.

risposta

43

È possibile impostare il flag Pattern.DOTALL in modo che corrisponda a newline ., per impostazione predefinita non lo fa. È fatto con la notazione (?s). Quindi, questo regex fa ciò che si vuole:

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

allora perché il primo match (io sono su Windows) ? – Axel

+1

Inoltre, potresti voler cambiare la parte '[\ r \ n]' in '\ r? \ N' per poter abbinare sia' \ n' che '\ r \ n'. – Keppil

+2

Appena scoperto. Su Windows, il line-end è '\ r \ n'. Il '\ n' in' input1' non è considerato una fine riga e quindi la regex corrisponde. – Axel

9

In Windows, in Java, è \n LF, \r è CR e %n è CRLF. Il tuo modello non corrisponde a quest'ultimo.

A partire da Java 8, ora è possibile utilizzare \R nelle espressioni regolari per adattarsi a qualsiasi sequenza di fine riga.

Linebreak matcher

\R Qualsiasi Unicode sequenza di interruzione di riga, è equivalente a \u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]

Esempio:

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

Sì, ". * \ R? \ N. *" Funziona, ma non se ci sono più interruzioni di riga. Ora sto usando "(? S). * [\ N \ r]. *". – Axel

Problemi correlati