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

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

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

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

这将替换大括号之间的所有文本并保留括号这是使用正面向前看和正面看后面完成的

 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){}”

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

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

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

这与XML / HTML解析器不使用正则表达式的原因相同

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

 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, ""); } 

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

所以, 基本的伪模式

 a [^ ab ]* b 

哪里:

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

因此, 要替换{}之间的所有文本(在大括号之间) ,请使用

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

请参阅IDEONE演示

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