正则表达式与从Formatter对象获得的换行符不匹配

时间:2012-07-25 06:46:46

标签: java regex formatter

使用%n对象或Formatter中的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。

2 个答案:

答案 0 :(得分:47)

您可以设置Pattern.DOTALL标记以使.与新行匹配,但默认情况下则不然。它使用(?s)表示法完成。所以,这个正则表达式做你想要的:

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

答案 1 :(得分:14)

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

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

  

Linebreak matcher

     

\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