在Java中用<br />替换\n和\r\n

74

这个问题在多种语言中被问过多次,但我无法让它正常工作。我有一个像这样的字符串

String str = "This is a string.\nThis is a long string.";

我正在尝试使用以下代码将\n替换为<br />

And I'm trying to replace the \n with <br /> using

str = str.replaceAll("(\r\n|\n)", "<br />");

但是 \n 没有被替换。 我尝试使用这个RegEx工具进行验证,结果看到了相同的结果。输入的字符串没有与 "(\r\n|\n)" 匹配。我做错了什么?


我也尝试过 "(\\r\\n|\\n)" - Bala R
2
你能否发布一个更完整的例子?我认为错误不在你发布的代码中。 - Mark Byers
1
我基本上有相同的两行代码,并且我正在Eclipse中的调试模式下进行测试,在replaceAll()之后设置了一个断点. - Bala R
[\r?\n] 也可以工作。 - amarjeetAnand
7个回答

123

对我而言,它起作用了。

public class Program
{
    public static void main(String[] args) {
        String str = "This is a string.\nThis is a long string.";
        str = str.replaceAll("(\r\n|\n)", "<br />");
        System.out.println(str);
    }
}

结果:

这是一个字符串。
这是一个很长的字符串。

你的问题在其他地方。


21

对我而言,这个方法有效:

rawText.replaceAll("(\\\\r\\\\n|\\\\n)", "\\\n");

提示:使用正则表达式测试工具进行快速测试,无需在您的环境中编译。


20
我认为你那里反斜杠不够了 :) - Richard J. Ross III
1
我曾经遇到过同样的问题。问题在于输出显示的是“\n”,但为了使其正常工作,它应该是一个由“\\n”组成的字符串,因此输出结果为“\n”,导致错误的解释 :) - Cyril N.
你需要使用这段代码:rawText.replaceAll("(\\r\\n|\\n)", "\\n"); - Iefimenko Ievgen

19

以下是一个更为健壮的版本,能够实现您试图实现的功能:

str = str.replaceAll("(\r\n|\n\r|\r|\n)", "<br />");

4
不需要使用更长的方法。StringreplaceAll(...)在幕后完全执行了此操作。这是它的方法体:return Pattern.compile(expr).matcher(this).replaceAll(substitute):http://www.docjar.com/html/api/java/lang/String.java.html - Bart Kiers

11

由于我的账户是新的,我无法为Nino van Hooff的回答点赞。如果你的字符串来自基于Windows的源,比如基于aspx的服务器,这个解决方案确实可行:

rawText.replaceAll("(\\\\r\\\\n|\\\\n)", "<br />");

似乎是一个奇怪的字符集问题,因为双反斜杠被解释为单个斜杠转义字符。因此需要使用上面的四个斜杠。

再次提醒,在大多数情况下,"(\\r\\n|\\n)"应该工作正常,但如果您的字符串来自基于Windows的源,请尝试上述方法。

只是一个提示,我尝试了一切来纠正我替换那些行末的问题。起初以为是从Windows-1252UTF-8的转换失败。但那也没用。最后这个解决方案才真正解决了问题。 :)


2

对我来说没问题。Java代码完全按照你写的工作。在测试器中,输入字符串应为:

This is a string.
This is a long string.

使用实际换行符。请勿使用以下内容:

This is a string.\nThis is a long string.

由于它将\n视为字面序列反斜杠'n',因此会出现问题。


0

那应该能够运行,但不要拼命尝试去理解它。只需要使用两个步骤。

str  = str.replaceAll("(\r\n)", "<br />");
str  = str.replaceAll("(\n)", "<br />");

免责声明:这并不是非常高效的。


如果你只需要进行两次替换,那么就不需要使用正则表达式,可以直接使用以下代码:str = str.replace("\r\n", "<br />").replace("\n", "<br />"); - Bart Kiers
@BartK,我认为String类中没有replace(String,String)方法。我只能找到replace(Char, Char)方法。 - Bala R
5
没错,确实没有这样的方法。但是有一个replace(CharSequence, CharSequence)。请注意,String本身就是一个CharSequence - Bart Kiers

-2

这应该可以工作。你需要输入两个斜杠

str = str.replaceAll("(\\r\\n|\\n)", "<br />");

在这个参考文献中,有一个例子展示了
private final String REGEX = "\\d"; // a single digit

在我的许多项目中,我使用了两个斜杠,似乎也能正常工作!


2
实际上,你不需要两个斜杠。 - Mark Byers
不确定你的参考资料与你的回答其他部分有什么关系。说“你需要输入两个斜杠”甚至是错误的,老实说。 - Bart Kiers
就像我说的一样:两个都可以使用(Mark并没有说你的建议不可行,你只需要一个反斜杠即可,不需要两个)。关键是:你的评论中“需要”两个反斜杠(而不是一个)仍然是错误的。在字符串字面值内部,“\d”变成了“\d”,而“\n”仍然只是“\n”(换行符),换句话说:你不能将这两者进行比较。 - Bart Kiers
2
我看到你删除了所有的评论,这让我相信你理解了我的言论。我建议你也删除你的回答,因为大部分都是不正确的(别担心,这样做不会让你失去积分)。如果你把它留在这里(带着错误的声明),很可能会引来更多的负评。 - Bart Kiers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接