Java Regex匹配空白行

时间:2014-04-15 15:47:08

标签: java regex

我正在尝试从格式化字符串的中间提取一系列不可预测的文本。以下是我的字符串可能的示例:

  

本部分从未改变有效负载
用户和权力信件   andDigitsNotPredictable
ButDoesIncludeLineBreaks

  OtherStuffThatIDon'tWant

请注意,此处必须保留换行符。在这个例子中,我想在String变量中捕获这个文本:

  

净荷
UppErAndLowerCaseLetters
  andDigitsNotPredictable
ButDoesIncludeLineBreaks

所以,我的“分隔符”是开头的标题部分THIS PART NEVER CHANGES,最后是双行分隔符。这是棘手的部分。如何编写正则表达式以识别双换行符,但排除单个换行符?这就是我所拥有的:

String payload = "THIS PART NEVER CHANGES" + 
        System.getProperty("line.separator") +
        "(.+?)" + 
        System.getProperty("line.separator") +
        System.getProperty("line.separator");

BufferedFileReader bfr = new BufferedFileReader();
String file_contents = bfr.readFileToString(myFile);

Pattern pattern = Pattern.compile(payload);
Matcher matcher = pattern.matcher(file_contents);

while (matcher.find()) 
    System.out.println(matcher.group());

这几乎可行。如果我从有效负载字符串中取出最后一个System.getProperty("line.separator"),我会从有效负载中获取第一个行。当我把它留下时,我什么都没得到。

谁能告诉我我做错了什么?谢谢!

3 个答案:

答案 0 :(得分:4)

您需要使用DOTALL标记来匹配换行符

Pattern pattern = Pattern.compile(payload, Pattern.DOTALL);

答案 1 :(得分:2)

正则表达式

(?m:^(?=[\r\n]|\z))

将匹配一个空行,因为m会导致^在行的开头而不是输入的开头匹配,并且(?=[\r\n]|\z)向前看到输入的换行符或结尾

至于问题的根本原因,Reimeus对DOTALL是正确的。

答案 2 :(得分:1)

为什么不为换行使用特定的量词?

例如:

Pattern p = Pattern.compile("\n{2,}");
String line = "\n\n";
System.out.println(p.matcher(line).find());

<强>输出

true

如果您想使用系统行分隔符的转义表示形式(而不是手动添加转义的String,无论是\n还是\r\n,请查看{{3} SO线程。