所以我有一些xml我试图重新格式化,并且我试图找到所有的键/值对。除非我有一个包含密钥的注释行,否则一切正常。以下是有问题的行:
<!-- <add key="FTPRoot" value="\\productionshare\FTP" /> -->
<add key="FTPRoot" value="C:\FTP" />
第一行应该被忽略,第二行最后应该有四次捕获(两次匹配,每次两次捕获)。下面的正则表达式允许多次捕获,并且第二行的行为正确,但也不正确(我没有考虑到它,正则表达式不应该责备)拿起第一行:
/(\S*)=(["].*?["])/g
这将忽略第一行,但在第二行上无法匹配两次,从而通过四次捕获授予我。
/<[^!].*?(\S*?)=(["]\S*["])/g
所以,我缺少什么来获得我需要的捕获。即使需要,我也可以进行整行匹配,这只是我失踪的第二次捕捉。
答案 0 :(得分:1)
如果必须使用正则表达式,则以下内容应该有效:
/<!--(?:.|\n)*?-->|(\S*)="(.*?)"/g
这与注释行匹配,但不会创建捕获。这意味着您可以忽略完整匹配,并且捕获具有您需要的内容。
答案 1 :(得分:0)
通过不将整个#comment
文档作为字符串传递给XML
,排除RegExp
节点与匹配的可能性。迭代XML
documentElememt
.childNodes
并仅在非#comment
个节点的节点上执行任务。
<script>
let str = `<?xml version="1.0" encoding="UTF-8"?><root><!-- <add key="FTPRoot" value="\\productionshare\FTP" /> -->
<add key="FTPRoot" value="C:\FTP" /></root>`;
let parser = new DOMParser();
let xml = parser.parseFromString(str, "application/xml");
for (let node of xml.documentElement.childNodes) {
// do stuff with nodes that are not `#comment` nodes
if (node.nodeType !== 8) {
console.log(node)
}
}
</script>
&#13;