用正则表达式替换Java中的大括号{}之间的所有文本

时间:2013-10-03 18:23:49

标签: java regex string

我有一个很长的字符串,{}之间有很多文字出现,我想删除但是当我这样做时:

data = data.replaceAll("{(.*?)}", "");

我收到错误,所以我做错了什么/我应该怎么做呢?

5 个答案:

答案 0 :(得分:7)

这将替换大括号之间的所有文本并保留括号 这是通过积极向前看和积极展望

来完成的
data = data.replaceAll("(?<=\\{).*?(?=\\})", "");

“if(true){calc();}”变为“if(true){}”

这将替换花括号之间的所有文本并删除括号

data = data.replaceAll("\\{.*?\\}", "");

“if(true){calc();}”变为“if(true)”

这将替换大括号之间的所有文本,包括新行。

data = Pattern.compile("(?<=\\{).*?(?=\\})", Pattern.DOTALL).matcher(data).replaceAll("");

“if(true){\ n \ t \ t \ t \ tcalc(); \ n}”变为“if(true){}”

答案 1 :(得分:5)

你需要转义左括号,因为它表示量词的开始 - {n}在正则表达式中。并且您并不真正需要捕获组,因此请将其删除。

data = data.replaceAll("\\{.*?}", "");

答案 2 :(得分:1)

一般来说,这是一项不适合正则表达式开始的工作。通常,如果“{text}”是可能的,那么“{{text1} {text2}}”无法使用正则表达式进行正确解析。

这与XML / HTML解析器不使用正则表达式

的原因相同

答案 3 :(得分:1)

试试这个,这可能会对你有帮助。

String refinedData = new String(data);
Pattern p = Pattern.compile("\\{[^\\}]*\\}");
Matcher m = p.matcher(data);
while(m.find()){
    String d = data.substring(m.start(), m.end());
    refinedData = refinedData.replace(d, "");
}

答案 4 :(得分:0)

当您需要将单个字符中的子字符串与另一个单个字符匹配时,最好的正则表达式解决方案是使用分隔符并在它们之间插入negated character class匹配除分隔符之外的任何字符。

因此,基本伪模式

a  [^ ab  ]*  b

其中:

  • a - 起始分隔符
  • [^ab]* - 除ab以外的零个或多个字符
  • b - 尾随分隔符。

所以,替换{}之间(大括号之间)的所有文字,请使用

String data = "text 1 {\ntext 2\ntext 3\n}";
System.out.println(data.replaceAll("\\{[^{}]*}", ""));
// => text 1

请参阅IDEONE demo

请注意,在Java正则表达式中,{}不必在字符类中进行转义,并且}不必在其外部进行转义。只有字符类之外的{ 必须被转义(或放入字符类),以免形成限制量词构造。