2

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

$ 行尾

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

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

我猜结果将是:

firstline*
secondline*

但我看到了这个结果:

firstline
secondline*

它似乎$只匹配字符串的结尾。那么为什么文档说它匹配“行尾”呢?

4

3 回答 3

3

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

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

IE:

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

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

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

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

于 2014-06-25T15:52:42.343 回答
3

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

但是,使用“多行”标志很容易解决这个问题;更改您的正则表达式以(?m)在前面添加:

String regex = "(?m)$";

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

于 2014-06-25T15:52:58.440 回答
1

这对于您输入的结束是确定的。如果您的输入中有换行文字,$则不会匹配它们。

如果要匹配每个换行符,例如:

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

可能会奏效。

于 2014-06-25T15:50:02.927 回答