2017-08-04 53 views
0

所以我有一些xml我试图重新格式化,而我试图找到所有的键/值对。除了当我有一个包含键的注释行时,所有东西都可以工作。下面是所讨论的行:正则表达式 - 忽略带有多个捕获的注释xml行

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

第一行应被忽略,并且所述第二线应具有四个捕获(两场,每两个摄像)结束。以下正则表达式允许多个捕获和正确行为的第二线,但也不正确(不考虑它,正则表达式是不怪)拾取的第一行:

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

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

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

所以,我错过什么得到我所需要的捕捉。即使需要,我也可以进行全线比赛,这只是我错过的第二次比赛。

+0

如果这在JavaScript中,而不是使用正则表达式,我建议一个XML到JSON转换器。 https://www.npmjs.com/package/xml2js – thomasmeadows

+1

解析整个XML然后重新生成它可能会更简单。 – bfontaine

+0

如果评论是多行的,该怎么办? –

回答

0

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

<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>

1

如果你必须使用正则表达式,下面应该工作:

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

这个注释行一致,但不创建捕获。这意味着您可以忽略完整匹配,并且捕获有您所需要的。