正则表达式与从Formatter对象获得的换行符不匹配
通过在Formatter
对象或String.format()
使用%n
获取换行符时,我无法匹配包含换行符的String。 请看下面的程序:
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。
您可以设置要生成的Pattern.DOTALL
标志.
匹配换行符,默认情况下不匹配换行符。 它是用(?s)
表示法完成的。 所以,这个正则表达式做你想要的:
String pattern = "(?s).*[\n\r].*";
在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