java regex $ metacharacter

时间:2014-06-25 15:46:47

标签: java regex end-of-line

我是java regex的新手。我在Docs中看到了这一点:

  

$行尾

但是当我尝试这个片段时:

String str = "firstline\r\nsecondline";
String regex = "$";
System.out.println(str.replaceAll(regex, "*"));

我猜结果将是:

firstline*
secondline*

但我看到了这个结果:

firstline
secondline*

似乎$只匹配String的结尾。那么为什么文档说它匹配“一行结束”?

3 个答案:

答案 0 :(得分:3)

您必须启用多线模式,然后$将匹配两者,一行的结尾和输入的结尾:

http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#MULTILINE

即:

Pattern.compile("$",Pattern.MULTILINE);

您还可以使用标志表达式(?m),即:

Pattern.compile("(?m)$");

你引用的oracle文档在这里真的很不精确。模式类(上面的链接)的文档更精确,应该是Java RegExs的参考。

答案 1 :(得分:3)

$表示输入的结尾,而不是的结尾。

然而,使用“多线”标志可以很容易地解决这个问题。更改正则表达式,在前面添加(?m)

String regex = "(?m)$";

多行标志使插入符号^和美元$匹配行的开头和结尾

答案 2 :(得分:1)

对于输入的结束它是决定性的。如果您的输入中有换行符,则$将与它们不匹配。

如果您想匹配每个换行符,请执行以下操作:

str.replaceAll("(\r\n|$)", "*$1");

可能有用。