正则表达式 - 忽略带有多个捕获的xml行

时间:2017-08-04 16:44:47

标签: javascript regex

所以我有一些xml我试图重新格式化,并且我试图找到所有的键/值对。除非我有一个包含密钥的注释行,否则一切正常。以下是有问题的行:

<!-- <add key="FTPRoot" value="\\productionshare\FTP" /> -->
<add key="FTPRoot" value="C:\FTP" />

第一行应该被忽略,第二行最后应该有四次捕获(两次匹配,每次两次捕获)。下面的正则表达式允许多次捕获,并且第二行的行为正确,但也不正确(我没有考虑到它,正则表达式不应该责备)拿起第一行:

/(\S*)=(["].*?["])/g

这将忽略第一行,但在第二行上无法匹配两次,从而通过四次捕获授予我。

/<[^!].*?(\S*?)=(["]\S*["])/g

所以,我缺少什么来获得我需要的捕获。即使需要,我也可以进行整行匹配,这只是我失踪的第二次捕捉。

2 个答案:

答案 0 :(得分:1)

如果必须使用正则表达式,则以下内容应该有效:

/<!--(?:.|\n)*?-->|(\S*)="(.*?)"/g

这与注释行匹配,但不会创建捕获。这意味着您可以忽略完整匹配,并且捕获具有您需要的内容。

答案 1 :(得分:0)

通过不将整个#comment文档作为字符串传递给XML,排除RegExp节点与匹配的可能性。迭代XML documentElememt .childNodes并仅在非#comment个节点的节点上执行任务。

&#13;
&#13;
<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;
&#13;
&#13;