Java中如何移除花括号

8

我有一个文本文件,每行都以花括号开头和结尾:

{aaa,":"bbb,ID":"ccc,}  
{zzz,":"sss,ID":"fff,}  
{ggg,":"hhh,ID":"kkk,} ...  

字符之间没有空格。我试图去除花括号并将其替换为空格,如下:

String s = "{aaa,":"bbb,ID":"ccc,}";
String n = s.replaceAll("{", " ");  

我尝试使用转义符号来转义花括号,如下:

String n = s.replaceAll("/{", " "); 
String n = s.replaceAll("'{'", " "); 

这些方法都不起作用,它会显示错误。有人知道解决办法吗?


7
请注意,斜杠 / 不会转义字符,而反斜杠 \ 会。 - Ryan Hurling
1
你是否遇到了“模式语法异常”,还是什么都没有发生? 此外,正如@RyanHurling所说,您需要使用\\进行转义。 http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html - MirroredFate
抱歉,我在帖子中犯了一个错误,正确的网址是 /。 - user2778018
3个回答

23

你不能像下面这样定义一个字符串:

String s = "{aaa,":"bbb,ID":"ccc,}";

错误在这里,你必须转义字符串内的双引号,像这样:

String s = "{aaa,\":\"bbb,ID\":\"ccc,}";

现在,如果您调用此函数,将不会出现错误。

s.replaceAll("\\{", " ");

如果您有一个IDE(如eclipse这样的程序),您会注意到字符串与标准颜色黑色不同(例如方法或分号的颜色[;])。 如果该字符串完全是相同的颜色(通常是褐色,有时是蓝色),那么您就应该没问题,如果您注意到一些黑色的内容,则说明您做错了什么。 通常,您会在双引号 ["] 后面放置一个加号 [+],然后是要添加到字符串中的内容。例如:

String firstPiece = "This is a ";
// this is ok:
String all = s + "String";
//if you call:
System.out.println(all);
//the output will be: This is a String

// this is not ok:
String allWrong = s "String";
//Even if you are putting one after the other the two strings, this is forbidden and is a Syntax error.

1
虽然在他举的例子中是正确的,但我认为他从文本文件中读取s的值,所以这不应该是错误的原因...但我可能错了。 - MirroredFate
1
String.replaceAll() 接受一个正则表达式,而正则表达式需要转义 '{' 字符。 - Alex
确实,你必须要双重转义它;)而不是单个转义;)你的答案没问题,但你的评论不太对。我会编辑我的答案。还有我的评论,我的答案集中在双引号的转义上,我没有注意到要编辑提问者发布的代码。赞同你的答案。 - Gianmarco
1
尝试使用 replaceAll("\\{|\\}", " ") 或者 replaceAll("[{}]", " ")。这对我来说运行良好。 - Smit
我信任你并编辑了我的答案,即使 \s 对我来说很奇怪 ;) 现在我很高兴我没有错 ;) - Gianmarco
显示剩余5条评论

19

String.replaceAll()接受正则表达式作为参数,而正则表达式需要对'{'字符进行转义。因此,将以下内容替换:

s.replaceAll("{", " ");

随着:

s.replaceAll("\\{", " ");

请注意双转义 - 一个用于Java字符串,一个用于正则表达式。

然而,在这里您不需要使用正则表达式,因为您只匹配单个字符。所以你可以使用replace方法代替:

s.replace("{", " "); // Replace string occurrences
s.replace('{', ' '); // Replace character occurrences

或者,使用正则表达式版本一次替换两个花括号:

s.replaceAll("[{}]", " ");

因为花括号({})在字符类([])中,所以这里不需要进行转义。


感谢大家的建议。特别感谢Alex回答了我的问题...现在我可以安心睡觉了;-) - user2778018

3

补充以上答案:

如果有人尝试像下面这样做,将不起作用:

 if(values.contains("\\{")){
        values = values.replaceAll("\\{", "");
    }
    if(values.contains("\\}")){
        values = values.replaceAll("\\}", "");
    }

如果您正在使用contains(),请使用以下代码:

if(values.contains("{")){
        values = values.replaceAll("\\{", "");
    }
    if(values.contains("}")){
        values = values.replaceAll("\\}", "");
    }

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