[英]how to replace particular occurence of string with regex in javascript
这是代码,它用于单行字符串,但不适用于多行文本。 我正在从 xml 文件中提取数据。
let xmlData = `<?xml version="1.0" encoding="utf-8"?>
<RecipeData>
<SUNDAY Value="1"/>
<SUNDAY/>
<SUNDAY/>
<SUNDAY/>
<MONDAY Value="1"/>
</MONDAY>
<MONDAY>
</MONDAY>
</RecipeData>`;
search = '<SUNDAY/>'
let n = 2
console.log(xmlData.replace(RegExp("((<SUNDAY(\s*)\/(\s*)>)$\g){" + n + "}"), function(x){return x.replace(RegExp("((<SUNDAY(\s*)\/(\s*)>)$\g)" + "$"), "HHHH")}))
预期输出:
我们正在替换第二次出现的
`<SUNDAY with HHHH.`
所以输出将是:
<?xml version="1.0" encoding="utf-8"?>
<RecipeData>
<SUNDAY Value="1"/>
<HHHHH/>
<SUNDAY/>
<SUNDAY/>
<MONDAY Value="1"/>
</MONDAY>
<MONDAY>
</MONDAY>
</RecipeData>;
一种选择是使用DOMParser ,例如计算nodeName
等于SUNDAY
的出现次数。
如果匹配,则通过 parentNode 将节点替换为新节点。
let xmlData = `<?xml version="1.0" encoding="utf-8"?> <RecipeData> <SUNDAY Value="1"/> <SUNDAY/> <SUNDAY/> <SUNDAY/> <MONDAY Value="1"> </MONDAY> <MONDAY> </MONDAY> </RecipeData>`, search = 'SUNDAY', n = 2; parser = new DOMParser(); xmlDoc = parser.parseFromString(xmlData, "text/xml"); let childNodes = xmlDoc.documentElement.childNodes; let nrSundays = 0; for (let i = 0; i < childNodes.length; i++) { if (childNodes[i].nodeName === search) { nrSundays++; if (nrSundays === n) { let childNode = childNodes[i]; childNode.parentNode.replaceChild(xmlDoc.createElement('HHHHH'), childNode); } } } console.log(new XMLSerializer().serializeToString(xmlDoc.documentElement));
另一种选择可能是使用评估使用 xpath
let xmlData = `<?xml version="1.0" encoding="utf-8"?> <RecipeData> <SUNDAY Value="1"/> <SUNDAY/> <SUNDAY/> <SUNDAY/> <MONDAY Value="1"> </MONDAY> <MONDAY> </MONDAY> </RecipeData>`, search = 'SUNDAY', n = 2; parser = new DOMParser(); xmlDoc = parser.parseFromString(xmlData, "text/xml"); let nodeSunday = xmlDoc.evaluate(`/RecipeData/${search}[${n}]`, xmlDoc.documentElement, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null); nodeSunday.singleNodeValue.parentNode.replaceChild(xmlDoc.createElement('HHHH'), nodeSunday.singleNodeValue); console.log(new XMLSerializer().serializeToString(xmlDoc.documentElement));
其他
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.