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.
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].*";
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