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

Posted

技术标签:

【中文标题】在java中用<br />替换\\n和\\r\\n【英文标题】:replace \n and \r\n with <br /> in java在java中用<br />替换\n和\r\n 【发布时间】:2011-03-04 15:57:41 【问题描述】:

已针对多种语言多次询问此问题,但我无法使其正常工作。 我有一个这样的字符串

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

我正在尝试使用 &lt;br /&gt; 替换 \n

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

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

【问题讨论】:

我也试过"(\\r\\n|\\n)" 你能发布一个更完整的例子吗?我认为错误不在您发布的代码中。 我几乎有相同的两行,我在 Eclipse 的调试模式下测试它,在 replaceAll() 之后有一个断点。 [\r?\n] 也可以。 【参考方案1】:

由于我的帐户是新帐户,因此我无法对 Nino van Hooff 的回答进行投票。如果您的字符串来自基于 Windows 的源,例如基于 aspx 的服务器,则此解决方案确实有效:

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

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

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

仅供参考,我尝试了一切来纠正我替换这些行尾的问题。起初的想法是从Windows-1252UTF-8 的转换失败。但这也不起作用。这个解决方案最终成功了。 :)

【讨论】:

【参考方案2】:

对我来说,这很有效:

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

提示:使用regex tester 进行快速测试,无需在您的环境中编译

【讨论】:

我认为你没有足够的反斜杠:) 我遇到了同样的问题。问题是输出显示“\n”,但要使其正常工作,它是一串“\\\\n”,输出结果为“\n”,因此解释错误:) 你需要使用这个代码:rawText.replaceAll("(\\\\r\\\\n|\\\\n)", "\\\\n"); 【参考方案3】:

您正在尝试的更强大的版本:

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

【讨论】:

没有必要做更冗长的方法。 StringreplaceAll(...) 在幕后正是这样做的。这是它的方法体:return Pattern.compile(expr).matcher(this).replaceAll(substitute):docjar.com/html/api/java/lang/String.java.html【参考方案4】:

它对我有用。 Java 代码的工作方式与您编写的完全一样。在测试器中,输入字符串应该是:

This is a string.
This is a long string.

...带有真正的换行符。你不能使用:

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

...因为它将\n 视为文字序列反斜杠'n'

【讨论】:

【参考方案5】:

这应该可行。你需要输入两个斜线

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

在这个Reference中,有一个例子显示

private final String REGEX = "\\d"; // a single digit

我在我的许多项目中都使用了两个斜线,它似乎工作正常!

【讨论】:

其实不需要两个斜线。 不确定您的参考与您的其余答案有什么关系。 “你需要输入两个斜线”这部分甚至是完全错误的,老实说。 就像我说的:两者都有效(马克也没有说你的建议没有用,你只是不需要两个反斜杠:一个就可以)。关键是:您的评论是需要两个反斜杠(反对只有一个)仍然是错误的。并且字符串文字中的\\d 变为\d,而字符串文字中的\n 仍然只是\n(换行符),换句话说:您无法比较两者。 我看到你删除了所有的 cmets,这让我相信你理解我的言论。我建议你也删除你的答案,因为你的大部分答案都不正确(别担心,这样做不会失去你的观点)。如果你把它留在这里(带有不正确的声明),它可能会吸引更多的反对票。【参考方案6】:

它对我有用。

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);
    

结果:

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

您的问题出在其他地方。

【讨论】:

【参考方案7】:

这应该可行,但不要试图弄明白。只需使用 2 次通行证。

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

免责声明:这不是很有效。

【讨论】:

如果您要进行两次替换,则不需要正则表达式,只需这样做:str = str.replace("\r\n", "&lt;br /&gt;").replace("\n", "&lt;br /&gt;"); @BartK 我认为 String 类中没有replace(String,String)。我只能找到replace(Char, Char) @Bala 正确,没有这种方法。但是有一个replace(CharSequence, CharSequence)。请注意,String CharSequence.

以上是关于在java中用<br />替换\n和\r\n的主要内容,如果未能解决你的问题,请参考以下文章

字符串用javascript数组中的逗号替换“<br>↵”

正则替换换行符和把 br 替换成换行符

PHP 用 <br/> 替换文字 \r\n (不替换新行)

java 特殊字符处理

java 去掉html标签

JavaScript 将 \n 替换为 <br /> [重复]