我之前在这里找到了这个问题但不知怎的,我无法看到我做错了什么。所以我有一个给定的字符串看起来像这样:
"这里有一些文字\ n \ nsome这里有更多文字"
我想删除换行符并在TextView中显示Text。我尝试使用String.replaceAll:
String newString = oldString.replaceAll("\\n", " ");
但这并没有改变文本中的任何内容。然而,
oldString.contains("\\n");
返回 true 。我做错了什么?
修改
对不起,我知道,oldString
并没有改变。问题在于,如果我打印oldString
和newString
,即使它说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()
?
答案 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","");