Java:正则表达式删除XML文件的某些部分



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

字符串文本 ="{{使用 dmy 日期|日期=2012 年 11 月}} {{信息框音乐 艺术家 |名字
= 拉斯·康威 |图像 = |caption = 拉斯·康威(Russ Conway(,照片在他 1959 年的正面 [[扩展游戏|EP]] ''更多 派对流行音乐''。|image_size = |背景 = non_vocal_instrumentalist |birth_name = 特雷弗·赫伯特 斯坦福 |别名 = |birth_date = {{出生 日期|1925|09|2|df=y}} |birth_place = [[布里斯托尔]], [[英格兰]], 英国 |death_date = {{死亡日期和 年龄|2000|11|16|1925|09|02|df=y}} |death_place = [[伊斯特本]], [[苏塞克斯]], 英格兰, 英国 |原产地 = | 乐器 = [[钢琴]] |流派 = |职业 = [[音乐家]] |years_active = |标签 = EMI (哥伦比亚(, 派, 音乐媒体, 丘吉尔 |associated_acts = | 网站 = |notable_instruments = }}";

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

我正在使用以下代码:

Pattern p1 = Pattern.compile(".*\({\{.+\}\}).*", Pattern.DOTALL);
Matcher m1 = p1.matcher(text);
while(m1.find()){
String text1 = text.replaceAll(m1.group(1), "");
}

我是正则表达式的新手,你能说出我做错了什么吗?

这通常不能使用正则表达式。 常规语言无法描述任意级别的嵌套,因为它们无法"计算"它们所处的级别。

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

如果需要,"手工"完成此操作可能会更容易。 自己扫描字符串,每次击打{{增加"支撑水平";每次你击中一个}}减少它。 当且仅当大括号级别为零时,将每个字符复制到输出。

类似的东西(未经测试(:

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

相关内容

  • 没有找到相关文章

最新更新