我正在尝试从格式化字符串的中间提取一系列不可预测的文本。以下是我的字符串可能的示例:
本部分从未改变有效负载
用户和权力信件 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")
,我会从有效负载中获取第一个行。当我把它留下时,我什么都没得到。
谁能告诉我我做错了什么?谢谢!
答案 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线程。