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

Axe*_*xel 18 java regex formatter

我无法匹配时,通过使用所获得的含有换行符换行符字符串%nFormatter对象或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));
  }

}
Run Code Online (Sandbox Code Playgroud)

及其输出:

Hallo
next line: true
Hallo
next line: false
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?为什么第二个字符串不匹配?

Java版本是1.6.0_21.

Kep*_*pil 51

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

    String pattern = "(?s).*[\n\r].*";
Run Code Online (Sandbox Code Playgroud)

  • 刚发现.在Windows上,lineend是`\ r \n`.`input1`中的`\n`不被视为行结束,因此正则表达式匹配. (2认同)

Sto*_*ica 16

在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
Run Code Online (Sandbox Code Playgroud)