2012-07-25 12 views
15

No puedo hacer coincidir una Cadena que contenga líneas nuevas cuando se obtiene la nueva línea usando %n en el objeto Formatter o String.format(). Por favor, eche un vistazo en el siguiente programa:La expresión regular no coincide con la nueva línea obtenida del objeto 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)); 
    } 

} 

y su salida:

Hallo 
next line: true 
Hallo 
next line: false 

lo que está pasando aquí? ¿Por qué la segunda cuerda no coincide?

La versión de Java es 1.6.0_21.

Respuesta

43

Puede establecer el indicador Pattern.DOTALL para hacer que . coincidan con las líneas nuevas, por defecto no lo hace. Se realiza con la notación (?s). Por lo tanto, esta expresión regular hace lo que quiere:

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

Entonces, ¿por qué la primera un partido (estoy en ventanas) ? – Axel

+1

Además, es posible que desee cambiar la parte '[\ r \ n]' a '\ r? \ N' para poder hacer coincidir tanto' \ n' como '\ r \ n'. – Keppil

+2

Acabo de enterarme. En windows, lineend es '\ r \ n'. El '\ n' en' input1' no se considera un final de línea y, por lo tanto, la expresión regular coincide. – Axel

9

En Windows, en Java, es \n LF, \r es CR y %n es CRLF. Su patrón no coincide con este último.

A partir de Java 8, ahora puede usar \R en expresiones regulares para que coincida con cualquier secuencia de fin de línea.

lineBreak matcher

\R Cualquier secuencia de salto de línea Unicode, es equivalente a \u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]

Ejemplo:

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. *" Funciona, pero no si hay varios saltos de línea. Ahora estoy usando "(? S). * [\ N \ r]. *". – Axel

Cuestiones relacionadas