我的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文件做任何事情,所以这似乎是唯一的方法。我如何取消上述评论?
答案 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"));
您将需要:
s
以启用dotall mode
,因为它是多行内容,因此我们希望该点也包含行终止符,Pattern.quote(String)
引用您的模式和<!--
和-->
之间的内容。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" />