在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.";
我正在尝试使用 <br />
替换 \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-1252
到UTF-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 />");
【讨论】:
没有必要做更冗长的方法。String
的 replaceAll(...)
在幕后正是这样做的。这是它的方法体: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", "<br />").replace("\n", "<br />");
@BartK 我认为 String 类中没有replace(String,String)
。我只能找到replace(Char, Char)
@Bala 正确,没有这种方法。但是有一个replace(CharSequence, CharSequence)
。请注意,String
是 CharSequence
.以上是关于在java中用<br />替换\n和\r\n的主要内容,如果未能解决你的问题,请参考以下文章