4

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

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

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

4

5 回答 5

14

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

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\tcalc();\n }" 变成 "if (true) {}"

于 2013-10-03T21:24:11.873 回答
5

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

data = data.replaceAll("\\{.*?}", "");
于 2013-10-03T18:24:37.823 回答
1

一般来说,这是一项不适合正则表达式的工作。通常如果 "{ text }" 是可能的,那么: "{ { text1 } { text2 } }" 不能用正则表达式正确解析。

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

于 2013-10-03T18:27:26.080 回答
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, "");
}
于 2013-10-03T19:00:47.717 回答
0

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

所以,基本的伪模式

a  [^ ab  ]*  b

在哪里:

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

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

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

查看IDEONE 演示

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

于 2016-05-23T20:50:46.883 回答