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



当使用Formatter对象或String.format()中的%n获取换行符时,我无法匹配包含换行符的字符串。请看一下以下程序:

public class RegExTest {
  public static void main(String[] args) {
    String input1 = String.format("Hallonnext line");
    String input2 = String.format("Hallo%nnext line");
    String pattern = ".*[nr].*";
    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。

您可以设置Pattern.DOTALL标志以使.与换行符匹配,默认情况下不会。它是用(?s)表示法完成的。因此,这个正则表达式可以满足您的要求:

    String pattern = "(?s).*[nr].*";

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

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

换行匹配器

R任何Unicode换行序列,等同于u000Du000A|[u000Au000Bu000Cu000Du0085u2028u2029]

示例:

String pattern = ".*\R.*";
String.format("Hallonnext line").matches(pattern); // true
String.format("Hallo%nnext line").matches(pattern); // true
String.format("Hallo same line").matches(pattern); // false

最新更新