java正则表达式$元字符

java正则表达式$元字符,java,regex,end-of-line,Java,Regex,End Of Line,我不熟悉java正则表达式。我在以下方面看到了这一点: 一行的末尾 但当我尝试这段代码时: String str = "firstline\r\nsecondline"; String regex = "$"; System.out.println(str.replaceAll(regex, "*")); 我想结果会是: firstline* secondline* 但我看到了这个结果: firstline secondline* 它似乎只匹配字符串的结尾。那么为什么文档会说它与“一行的结

我不熟悉java正则表达式。我在以下方面看到了这一点:

一行的末尾

但当我尝试这段代码时:

String str = "firstline\r\nsecondline";
String regex = "$";
System.out.println(str.replaceAll(regex, "*"));
我想结果会是:

firstline*
secondline*
但我看到了这个结果:

firstline
secondline*

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

输入的结尾是确定的。如果输入中有换行文字,
$
将不匹配它们

如果要匹配每条换行符,请执行以下操作:

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

可能有效。

您必须启用多行模式,然后,
$
将同时匹配行尾和输入端:

i、 e:

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

Pattern.compile("(?m)$");
你引用的甲骨文文档在这里真的很不精确。模式类的文档(上面的链接)更精确,应该作为Java正则表达式的参考。

$表示输入结束,而不是行结束

然而,使用“多行”标志很容易解决这一问题;将正则表达式更改为在前面添加
(?m)

String regex = "(?m)$";

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

$
\z
之间有什么区别?@SotiriosDelimanolis
\A
\z
匹配输入的开始和结束,而不考虑标志。如果不启用多行标志,则它们是插入符号和美元的同义词。也许您需要
“(\r?\n |$)”
btw+1
String regex = "(?m)$";