Java正则表达式-使用String的replaceAll方法替换换行符

47

我有一个字符串,想要将其中所有的换行符都替换为字符串" --linebreak-- "

只需要编写以下代码即可:

string = string.replaceAll("\n", " --linebreak-- ");

我对正则表达式部分感到困惑。对于换行符,我是否需要两个斜杠?这样做够用吗?


1
两种方法都可以。请参考这个问题中的答案,有很好的解释。 - Kevin K
8个回答

76

不要使用正则表达式!你只需要进行纯文本匹配来替换"\n"

使用replace()方法来用一个字符串替换另一个字符串:

string = string.replace("\n", " --linebreak-- ");
请注意,replace() 仍然替换 所有 出现的内容,replaceAll() 也一样 - 不同之处在于 replaceAll() 使用正则表达式进行搜索。

2
所以你是说要在循环中使用replace()而不是一次使用replaceAll()吗?我不明白为什么这是一个更好的想法? - Tim
8
调用 replace() 方法一次即可替换所有出现的字符串(无需“循环”)。 - Bohemian
哦,哇。谢谢你,不知道为什么我在阅读规范时忽略了那个。 - Tim
@Bohemian 不确定这是否完全正确 - 在一个包含多个空格的字符串中(" "),使用replaceAll("\s+"," ")将会把所有连续的多个空格缩减为一个,而仅使用replace(...)则只会替换一次。 - Alkanshel
8
replace() 方法可以替换所有匹配到的字符串。问题在于 replaceAll() 的命名不太准确:两个方法都会替换所有出现的字符串,它们唯一的区别在于 replaceAll() 使用正则表达式来查找匹配项,而 replace() 只使用纯文本。 - Bohemian
我使用 string = string.replace("\\n", System.lineSeparator()); 这段代码。但是这只适用于从外部源(例如从命令行)传入的“换行符”,因此上述代码将文字中的字面'/n'替换为实际的“新行”,你可能一直在尝试相反的操作。 - Matt

46

使用以下正则表达式:

 s.replaceAll("\\r?\\n", " --linebreak-- ")

对于UNIX和Windows操作系统,实际上只有两种换行符。


s.replaceAll("\r?\n", " --linebreak-- "); 对我有效 - Mahdi Esmaeili
1
可以使用正则表达式分隔符来删除注释,例如s.replaceAll(/^#.*\\r?\\n/, "") - lepe

37

自从Java 8正则表达式引擎支持\R表示任何行分隔符(更多信息:https://dev59.com/OHRB5IYBdhLWcg3w9L3n#31060125)。

因此,如果您可以访问Java 8或更高版本,则可以使用

string = string.replaceAll("\\R", " --linebreak-- ");

4

不需要2个 反斜杠

 String string = "hello \n world" ;
 String str = string.replaceAll("\n", " --linebreak-- ");
 System.out.println(str);

输出 = 你好 --换行-- 世界


2

为了完整性起见,我在这里补充一下,因为两个反斜杠的问题是真实存在的。

请参考以下SO问题中@dasblinkenlight的答案(谈论\t但它也适用于\n):

java, regular expression, need to escape backslash in regex

“有两种转义序列的解释:首先是Java编译器,然后是正则表达式引擎。当Java编译器看到两个斜杠时,它会将它们替换为一个单斜杠。当斜杠后面跟着t时,Java将其替换为制表符;当双斜杠后面跟着t时,Java不做任何处理。但是,由于两个斜杠被替换为一个单斜杠,正则表达式引擎看到\t,并将其解释为制表符。”


另一个正在发生的事情是replaceAll的第一个参数可以是一个普通字符串或正则表达式。在字符串中,"\n"被解释为字面量,但如果您包含其他正则表达式符号,例如字符集的括号,则需要额外的斜杠才能将正确的字符串传递给正则表达式编译器,就像您所说的......例如,"[\r\n]+" - Rondo

1

1

换行可以使用一个属性

System.getProperty("line.separator")

这里是您的例子,
string.replaceAll("\n", System.getProperty("line.separator"));

0
在我这个案例中,我想要用字面上的 '\n' 替换,所以我用另一个 \ 来转义。
String input = "a\nb\nc\nd";
/*
a
b
c
d 
*/
input = input.replace("\n", "\\n");
System.out.println(input); // a\nb\nc\nd

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