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


68

对于几种语言,已经多次询问了此信息,但我无法使其正常工作。我有这样的字符串

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

而且我想,以取代\n<br />使用

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

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


我也尝试过"(\\r\\n|\\n)"
Bala R

2
您能发表一个更完整的例子吗?我认为错误不在您发布的代码中。
Mark Byers 2010年

1
我几乎有相同的两行,并且我在eclipse中以调试模式对其进行了测试,其后有一个断点replaceAll()
Bala R 2010年

[\ r?\ n]也可以。
amarjeetAnand

Answers:


120

这个对我有用。

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

结果:

这是一个字符串。<br />这是一个长字符串。

您的问题在其他地方。



18

对我来说,这可行:

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

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


13
我认为您在那儿没有足够的反斜线:)
理查德·罗斯三世

1
我有同样的问题。事情是输出显示为“ \ n”,但是要使其正常工作,它是一个字符串“ \\\\ n”,而输出结果为“ \ n”,因此解释错误:)
Cyril N.

您需要使用以下代码:rawText.replaceAll(“(\\\\ r \\\\ n | \\\\ n)”,“ \\\\ n”);
Iefimenko Ievgwn

8

由于我的帐户是新帐户,因此我无法对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

那应该起作用,但是不要为了弄清楚而自杀。只需使用2个通行证即可。

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

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


如果您打算进行两次替换,则不需要正则表达式,而只需执行一次即可:str = str.replace("\r\n", "<br />").replace("\n", "<br />");
Bart Kiers 2010年

@BartK我认为replace(String,String)String类中没有。我只能找到replace(Char, Char)
Bala R

4
@Bala正确,没有这样的方法。但是有一个replace(CharSequence, CharSequence)。请注意,这String 一个 CharSequence
巴特·基尔斯

-2

这应该工作。您需要输入两个斜杠

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

在此参考中,有一个示例显示

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

我在许多项目中都使用了两个斜杠,看来效果很好!


2
实际上,您不需要两个斜杠。
Mark Byers 2010年

不知道您的参考与其余答案有什么关系。老实说,“您需要加两个斜杠”这一部分甚至是错误的。
巴特·基尔斯

就像我说的那样:都有效(Mark都没有说您的建议不起作用,您不需要两个反斜杠:一个就可以了)。关键是:您的注释需要两个反斜杠(仅一个反斜杠)仍然是错误的。而且\\d里面一个字符串变成\d同时\n内部字符串文字仍然只是\n(换行符),换句话说:你不能比较两个。
Bart Kiers 2010年

2
我看到您删除了所有评论,这使我相信您理解我的言论。我建议您也删除您的答案,因为大多数答案都不正确(不用担心,这样做不会使您的观点失去意义)。如果您将其遗漏在此处(带有不正确的声明),则很可能会吸引更多的反对票。
巴特·基尔斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.