通过Java中的regex取消注释XML元素

时间:2016-08-26 16:34:43

标签: java regex xml comments

我的XML如下所示,

<!-- Service Defs -->

<!-- <serviceName = "${NASA_Freedom.level.mission}"
                 MaxTimeOut = "20" minSpareHyperThread = "10" />
-->

我只需要取消注释serviceName元素:

<serviceName = "${NASA_Freedom.level.mission}"
                 MaxTimeOut = "20" minSpareHyperThread = "10" />

以下代码似乎没有做到这一点:

Pattern p = Pattern.compile("(<!--).*<serviceName = \\"${NASA_Freedom.*(-->)");
Matcher m = p.matcher(test);
if (m.find()) {
    System.out.println(m.replaceAll(""));
}

这似乎也是一种处理这种情况的坏方法。不幸的是我无法对XML文件做任何事情,所以这似乎是唯一的方法。我如何取消上述评论?

3 个答案:

答案 0 :(得分:1)

尝试使用此正则表达式:

<!--\s*(<serviceName\s*=\s*\"\${NASA_Freedom.level.mission}\".*?)\s*-->

正确转义字符这样的引号非常重要,这样您的Java语法才有效。

您希望使用Pattern.DOTALL作为Pattern.compile的参数,以便模式在多行中匹配(基本上告诉正则表达式引擎将.与换行符匹配)。

Pattern p = Pattern.compile("<!--\s*(<serviceName\s*=\s*\"\${NASA_Freedom.level.mission}\".*?)\s*-->", Pattern.DOTALL);

如果您使用捕获组1的内容替换每个匹配项,则应删除评论。

编辑:

如果你喜欢匹配评论并通过用空字符串替换它们来删除它们,请使用此正则表达式:

(<!--\s*)<serviceName\s*=\s*\"\${NASA_Freedom.level.mission}\".*?(\s*-->)

基本上只是从第一个正则表达式中反转分组。

答案 1 :(得分:1)

要取消注释给定的模式,您可以按下一步继续:

Pattern p = Pattern.compile(
    "(?s)<!--(.*" + 
     Pattern.quote("<serviceName = \"${NASA_Freedom.level.mission}\"") + 
    "((?!-->).)*)-->"
);
System.out.println(p.matcher(xml).replaceAll("$1"));

您将需要:

  1. 设置标记s以启用dotall mode,因为它是多行内容,因此我们希望该点也包含行终止符,
  2. 然后您需要使用Pattern.quote(String)引用您的模式和
  3. 最后将整个表达式替换为此处对应的第一个捕获组,以及<!---->之间的内容。
  4. NB:一旦取消注释,这个表达式就会使你的XML失效,因为它不再适合。

    NB2 :我添加了一个零宽度的否定前瞻,以防止在捕获的群组中出现-->,从而避免影响其他人的评论

答案 2 :(得分:1)

这是一种方式

查找:"<!--(?:(?!-->)[\\S\\s])*?(<serviceName\\s+(?:(?:(?:\"[\\S\\s]*?\")|(?:'[\\S\\s]*?'))|(?:[^>]*?))+\\s*/>)[\\S\\s]*?-->"

替换:"$1"基本上将第0组替换为字符串中的第1组)

扩展:

 <!-- 
 (?:
      (?! --> )
      [\S\s] 
 )*?

 (                             # (1 start)
      <serviceName \s+ 
      (?:
           (?:
                (?: " [\S\s]*? " )
             |  (?: ' [\S\s]*? ' )
           )
        |  (?: [^>]*? )
      )+
      \s* />
 )                             # (1 end)

 [\S\s]*? -->

输入:

<!-- Service Defs -->

<!-- <serviceName = "${NASA_Freedom.level.mission}"
                 MaxTimeOut = "20" minSpareHyperThread = "10" />
-->

输出:

 **  Grp 0 -  ( pos 25 , len 122 ) 
<!-- <serviceName = "${NASA_Freedom.level.mission}"
                 MaxTimeOut = "20" minSpareHyperThread = "10" />
-->  
 **  Grp 1 -  ( pos 30 , len 112 ) 
<serviceName = "${NASA_Freedom.level.mission}"
                 MaxTimeOut = "20" minSpareHyperThread = "10" />