2017-08-04 41 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 

這個註釋行一致,但不創建捕獲。這意味着您可以忽略完整匹配,並且捕獲有您所需要的。