Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java正则表达式-使用字符串';s replaceAll方法来替换换行符_Java_Regex_Newline - Fatal编程技术网

Java正则表达式-使用字符串';s replaceAll方法来替换换行符

Java正则表达式-使用字符串';s replaceAll方法来替换换行符,java,regex,newline,Java,Regex,Newline,我有一个字符串,只想用字符串“--linebreak--”替换其中的所有换行符 只要写下以下内容就够了吗 string = string.replaceAll("\n", " --linebreak-- "); 我对其中的正则表达式部分感到困惑。这条新线需要两条斜线吗?这够好吗?看起来不错。你不需要两个反斜杠 不需要2个反斜杠 String string = "hello \n world" ; String str = string.replaceAll("\n", " --linebr

我有一个字符串,只想用字符串
“--linebreak--”
替换其中的所有换行符

只要写下以下内容就够了吗

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

我对其中的正则表达式部分感到困惑。这条新线需要两条斜线吗?这够好吗?

看起来不错。你不需要两个反斜杠


不需要2个
反斜杠

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

使用下面的正则表达式:

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

UNIX和Windows操作系统实际上只有两个新行。

不要使用正则表达式。只需纯文本匹配即可替换
“\n”

用于将文字字符串替换为另一个文字字符串:

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

请注意,
replace()
仍然会替换所有出现的内容,正如
replaceAll()
一样-区别在于使用正则表达式进行搜索。

对于新行,有一个属性

System.getProperty("line.separator")
以你为例,

string.replaceAll("\n", System.getProperty("line.separator"));

只是为了完整性而添加这个,因为2反斜杠是真实的

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


对转义序列有两种解释:首先由Java编译器解释,然后由regexp引擎解释。当Java编译器看到两个斜杠时,它会用一个斜杠替换它们。当斜杠后面有t时,Java用一个制表符替换它;当双斜杠后面有一个t时,Java就不处理它了。但是,由于两个斜杠已被一个斜杠替换,因此regexp引擎会看到\t,并将其解释为一个选项卡。“

,因为Java 8 regex引擎支持表示任何行分隔符的
\R
(更多信息:)

因此,如果您能够访问Java8,您可以使用

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

这两种方法都有效。请参阅的答案以获得更好的解释。那么,你是说在循环中使用replace()而不是一次使用replaceAll()?我不明白为什么这是一个更好的主意?@Tim调用
replace()
once替换所有发生的事件(不需要“循环”)噢,哇。谢谢你,出于某种原因,我在阅读规范时忽略了这一点。@Bohemian不确定这是否完全正确——在一个包含多个空格(“”)的字符串中,执行replaceAll(“\\s+”,“”)会将所有多空格部分减少为一个,但简单地替换(…)只会执行一次。@Amalgovinus
replace()
将它们全部替换。问题是
replaceAll()
的名称不正确:这两种方法都替换所有出现的情况-它们之间唯一的区别是
replaceAll())
使用正则表达式查找匹配项,而replace使用纯文本。另一件事是,replaceAll的第一个参数可以是一个平面字符串或正则表达式。在字符串中,“\n”“被解释为文字,但如果包含其他仅限正则表达式的符号,如字符集的括号,则需要额外的斜杠,以便向正则表达式编译器获取正确的字符串,如您所说……例如,“[\\r\\n]+”s.replaceAll(“\r?\n”,“--linebreak-->”);为MECA工作也可以是:
s.replaceAll(/^#.*\\r?\\n/,“”)
。使用正则表达式分隔符删除注释的示例。