Java Regex Matcher没有给出预期的结果

时间:2014-01-16 23:54:36

标签: java regex

我有以下代码。

String _partsPattern = "(.*)((\n\n)|(\n)|(.))";
static final Pattern partsPattern = Pattern.compile(_partsPattern);
String text= "PART1: 01/02/03\r\nFindings:no smoking";
Matcher match = partsPattern.matcher(text);
while (match.find()) {
System.out.println( match.group(1));
return; //I just care on the first match for this purpose

      }

输出: PART1:01/02/0 我期待 PART1:01/02/03 为什么我文本末尾的3与我的结果不匹配。

2 个答案:

答案 0 :(得分:2)

正则表达式的问题在于.\r\n之类的行分隔符不匹配,因此您的正则表达式将在\r之前停止并且从正则表达式的最后部分开始< / p>

(.*)((\n\n)|(\n)|(.))
     ^^^^^^^^^^^^^^^

是必填项,且无法与\r匹配,最后一个字符将存储在(.)中。

如果您不想在匹配中包含这些行分隔符,请使用带有"(.*)$";标记的Pattern.MULTILINE模式,使$匹配每行的结尾(它将代表标准行\r\r\n\n之类的分隔符,但不会在匹配中包含它们。

请尝试使用

String _partsPattern = "(.*)$"; //parenthesis are not required now
final Pattern partsPattern = Pattern.compile(_partsPattern,Pattern.MULTILINE);

其他方法是将您的正则表达式更改为(.*)((\r\n)|(\n)|(.))(.*)((\r?\n)|(.)),但我不确定最后(.)的目的是什么(我可能会删除它)。它只是原始正则表达式的变体。

答案 1 :(得分:0)

作品,给予"PART1: 01/02/03 "。所以我的猜测是,在实际代码中,您可能会使用text读取Reader.readLine并错误地删除回车符+换行符。远远不过,但我无法想象。 (readLine剥离换行符本身。)