正则表达式与从格式化程序对象获取的换行符不匹配

2022-09-01 14:57:20

我无法匹配包含换行符的字符串,当通过使用 in object 或 获取换行符时。请看以下程序:%nFormatterString.format()

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

}

及其输出:

Hallo
next line: true
Hallo
next line: false

这是怎么回事?为什么第二个字符串不匹配?

Java 版本是 1.6.0_21。


答案 1

您可以设置标志以匹配换行符,因为默认情况下它不会。它是用符号完成的。因此,此正则表达式执行所需的操作:Pattern.DOTALL.(?s)

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

答案 2

在Windows上,在Java中,是LF,是CR,是CRLF。您的模式与后者不匹配。\n\r%n

从 Java 8 开始,您现在可以在正则表达式中使用 \R 来匹配任何行尾序列。

换行匹配器

\R任何 Unicode 换行序列 等效于\u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]

例:

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