25

%n当通过使用in Formatterobject 或获取换行符时,我无法匹配包含换行符的字符串String.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。

4

2 回答 2

67

您可以设置Pattern.DOTALL标志以.匹配换行符,默认情况下它不会。它是用(?s)符号完成的。所以,这个正则表达式做你想要的:

    String pattern = "(?s).*[\n\r].*";
于 2012-07-25T06:49:31.717 回答
21

在 Windows 上,在 Java 中\n是 LF、\rCR 和%nCRLF。您的模式与后者不匹配。

从 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
于 2012-07-25T08:50:06.530 回答