为什么我不能在给定的字符串中替换\ n?

时间:2015-10-21 10:56:49

标签: java android string

我之前在这里找到了这个问题但不知怎的,我无法看到我做错了什么。所以我有一个给定的字符串看起来像这样:

"这里有一些文字\ n \ nsome这里有更多文字"

我想删除换行符并在TextView中显示Text。我尝试使用String.replaceAll:

String newString = oldString.replaceAll("\\n", " ");

但这并没有改变文本中的任何内容。然而, oldString.contains("\\n");返回 true 。我做错了什么?

修改

对不起,我知道,oldString并没有改变。问题在于,如果我打印oldStringnewString,即使它说oldString确实包含" \ n",它们也完全相同。

这是我的代码:

Log.d(TAG, "contains: " + str.contains("\\n"));     
Log.d(TAG, "old: " + str);
str = str.replaceAll("\\n", " ");
Log.d(TAG, "new: " + str);

这就是我得到的:

contains: true
old: Vorgang nicht möglich\n\nBitte Karte entnehmen
new: Vorgang nicht möglich\n\nBitte Karte entnehmen

更新

感谢 Shivanshu Verma ,我尝试了str.replace("\\n"" ");而不是str.replaceAll("\\n", " ");,这有效!有谁知道,为什么我不能在这里使用replaceAll()

4 个答案:

答案 0 :(得分:10)

Java中的字符串是不可变的,因此带有替换的新字符串存储在newString中,而不是oldString。

修改

我现在看到你的问题实际上与Java String不变性无关,而是与replace()和replaceAll()之间的区别。它们之间的区别在于replaceAll()接受 regex 作为第一个参数,然后用第二个参数替换任何匹配,而replace()只接受CharSequence(其中String是一个实现)并将用第二个参数替换完全匹配。

在您的情况下,我认为您的原始字符串已转义换行符:

String str = "Vorgang nicht möglich\\n\\nBitte Karte entnehmen";

这意味着String实际上根本不包含换行符;它按字面意思"\n"包含。这意味着:

str.replaceAll("\\n", " ");

将解析正则表达式的第一个参数并替换换行符(其中没有),并且:

str.replace("\\n", " ");

将替换"\n"的完全匹配。还值得注意的是,正如其他人所指出的那样,contains()也没有引入正则表达式,这就是为什么运行:

oldString.contains("\\n");

返回true。

答案 1 :(得分:2)

您的代码完美无缺。

此测试将通过而没有任何错误:

@Test
public void testReplaceAll() {


    String newString = "line1\nline2\nline3".replaceAll("\\n", " ");

    assertThat(newString).isEqualTo("line1 line2 line3");
    assertThat(newString).doesNotContain("\\n");
}

答案 2 :(得分:1)

尝试使用Replace()方法而不是ReplaceAll()

String newString = oldString.replace("\\n", " ");

可能适用于你

答案 3 :(得分:1)

String newString = oldString.replace(" \ n","");