我有一个文件,通常是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()
请提供一种方法来实现这一目标。
答案 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 )