web-dev-qa-db-fra.com

L'expression régulière ne correspond pas à la nouvelle ligne obtenue à partir de l'objet Formatter

Je ne peux pas faire correspondre une chaîne contenant des sauts de ligne lorsque le saut de ligne est obtenu en utilisant %n Dans l'objet Formatter ou String.format(). Veuillez consulter le programme suivant:

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

}

et sa sortie:

Hallo
next line: true
Hallo
next line: false

Qu'est-ce qui se passe ici? Pourquoi la deuxième chaîne ne correspond-elle pas?

La version Java est 1.6.0_21.

20
Axel

Vous pouvez définir le Pattern.DOTALL drapeau pour faire . correspond aux nouvelles lignes, ce n'est pas le cas par défaut. C'est fait avec le (?s) notation. Donc, cette regex fait ce que vous voulez:

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

Sous Windows, en Java, \n est LF, \r est CR et %n est CRLF. Votre modèle ne correspond pas à ce dernier.

Depuis Java 8, vous pouvez maintenant utiliser \R dans les expressions régulières pour correspondre à n'importe quelle séquence de fin de ligne.

Matcher de saut de ligne

\R Toute séquence de saut de ligne Unicode équivaut à \u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]

Exemple:

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
16
OrangeDog