如何在java中执行replaceAll排除注释

时间:2014-08-23 10:55:33

标签: java xml regex

我有一个文件,通常是XML文件。我想替换所有出现的' x.y'与' p.q'。但在替换期间,我想忽略comments()中出现的x.y。

我试图使用String.replaceAll()来执行此任务。

例如:

<?xml version="1.0" encoding="UTF-8"?>
<name>This occurrence of x.y should be replaced</name>
<!-- This occurrence of x.y should not be replaced -->

我尝试使用String.replaceAll(&#34; x [\。] y&#34;,&#34; p.q&#34;)但我可以看到评论中的事件也被替换

我可以使用另一种替代方法,我可以逐行读取文件并排除以注释开头的行,但我有兴趣使用replaceAll()

请提供一种方法来实现这一目标。

2 个答案:

答案 0 :(得分:2)

虽然这不是您正在寻找的答案,但我有一个建议。

我建议使用适当的XML解析器(如Java DOM)来检查和替换节点中的文本,而不是将XML作为原始String处理。如果它们不是注释,那么这样的东西应该替换节点中的相应文本。

File f = new File("your.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(f);

NodeList eList = doc.getElementsByTagName("*");
for (int e = 0; e < eList.getLength(); e++) {
    Node element = eList.item(e);
    NodeList nList = element.getChildNodes();
    for(int n = 0; n < nList.getLength(); n++){
        Node node = nList.item(n);
        if(node.getNodeType()==Node.TEXT_NODE){
            node.setNodeValue(node.getNodeValue().replace("x.y", "p.q")); 
        }
    }
}

如果内存/效率是一个问题(比如当你的文件很大时),你最好使用SAX,这会更快(代码密集程度更高)并且不会存储XML存储器中。

编辑完Document后,您可能希望use a Transformer创建合适的输出。 (Official guide here,鲍里斯的诅咒蜘蛛的评论)

希望这有帮助。

进一步阅读;

答案 1 :(得分:1)

如果使用正则表达式,一个选项是使用lookarounds进行检查以仅替换外部注释:

(?s)x\.y(?!(?:(?!<!--).)+-->)

作为Java字符串:

"(?s)x\\.y(?!(?:(?!<!--).)+-->)"

使用(?s) DOTALL modifier使.也匹配换行符。

Test at regexplanet(点击 Java