Java:Regex删除XML文件的一部分

Java:Regex删除XML文件的一部分,java,regex,parsing,wikitext,Java,Regex,Parsing,Wikitext,我正在阅读一个维基百科XML文件,其中我必须删除大括号之间的任何内容。 例如,对于以下字符串: String text=“{{使用dmy日期|日期=2012年11月}}{{Infobox” 艺术家|姓名 =Russ Conway | image=| caption=Russ Conway,摄于其1959年[[Extended play | EP]]的正面 派对弹出“”。|图像大小=|背景= 非声乐乐器演奏家出生姓名=特雷弗·赫伯特 斯坦福大学|别名=|出生日期={{出生 日期| 1925 | 0

我正在阅读一个维基百科XML文件,其中我必须删除大括号之间的任何内容。 例如,对于以下字符串:

String text=“{{使用dmy日期|日期=2012年11月}}{{Infobox” 艺术家|姓名
=Russ Conway | image=| caption=Russ Conway,摄于其1959年[[Extended play | EP]]的正面 派对弹出“”。|图像大小=|背景= 非声乐乐器演奏家出生姓名=特雷弗·赫伯特 斯坦福大学|别名=|出生日期={{出生 日期| 1925 | 09 | 2 | df=y}|出生地=[[Bristol]], [[英国]],英国|死亡日期={{死亡日期和 年龄| 2000 | 11 | 16 | 1925 | 09 | 02 | df=y}死亡|地点= [[Eastbourne]],[[Sussex]],英国英格兰|原籍=| 乐器=[[钢琴]]|流派=|职业 =[[音乐家]]|活跃年数=|标签=EMI(哥伦比亚)、派伊、音乐媒体、丘吉尔|联合演出=| 网站=|值得注意的工具=}}”

应将其替换为空字符串。注意,该示例有多个新行和嵌套的{{…}

我正在使用以下代码:

Pattern p1 = Pattern.compile(".*\\({\\{.+\\}\\}).*", Pattern.DOTALL);
Matcher m1 = p1.matcher(text);

while(m1.find()){

String text1 = text.replaceAll(m1.group(1), "");
}

我是新加入regex的,你能告诉我我做错了什么吗

对于正则表达式,这通常是不可能的。常规语言无法描述任意级别的嵌套,因为它们无法“计算”它们所处的级别

如果绝对必须使用正则表达式,则可以通过手动编码所有嵌套可能性,创建一个可用于三级嵌套的繁琐表达式。但这将是非常麻烦的,实际上是对DRY的违反,而且远不是适合这项工作的合适工具

如果需要的话,“用手”可能更容易做到这一点。自己扫描字符串,每次点击
{
增加“大括号级别”;每次点击
}
减少它。当且仅当大括号级别为零时,将每个字符复制到输出

类似于(未经测试):

StringBuilder输出=新建StringBuilder();
char[]input=text.toCharArray();
int-level=0;
for(int i=0;i0){
//检查是否有与上述类似的闭合支撑
如果(i
您应该尝试找到一个合适的解析器。Java的正则表达式不适合未定义的嵌套级别。您所犯的错误是,
+
是贪婪的,并且将从第一个
{{
之后到最后一个
}之前匹配
。除了您正在使用的编程语言之外,您拥有所有的标记。@Jerry这就是我想要的,删除第一个“{{”和最后一个“}}”之间的任何内容@user2823318,这意味着您的变量文本将变为空?该字符串中的第一个字符是
{
,最后一个是
}
…好吧,不是空的,而是只
{{}
.Regex来删除XML文件的一部分-这是个坏主意。你可以为这些东西提供一个合适的XML解析器。这非常有效。我希望我不必求助于此。谢谢你的输入。
StringBuilder output = new StringBuilder();
char[] input = text.toCharArray();
int braceLevel = 0;
for (int i = 0; i < input.length; i++) {
   final char c = input[i];
   if (c == '{') {
      // Check for {{
      if (i < input.length - 1 && input[i+1] == '{') {
         // Yep, it's a double brace - increase the level, consume
         // the second character and continue with the next char
         braceLevel++;
         i++;
         continue;
      }
   }
   else if (c == '}' && braceLevel > 0) {
      // Check for a closing brace similar to above
      if (i < input.length - 1 && input[i+1] == '}') {
         braceLevel--;
         i++;
         continue;
      }
   }

   if (braceLevel == 0) {
      output.append(c);
   }
}

// Now output contains every character that was not contained within brackets