在我的C#应用程序中尝试通过使用正则表达式过滤掉我的一些XML元素来删除它。
我的输入是例如:
<myXMLTag id="Text1.Text2.Text3">
<Anything/>
</myXMLTag>
<myXMLTag id="Text1.ISHOULDNOTBEHERE.Text3">
<Anything/>
</myXMLTag>
<myXMLTag id="Text1.Text2.Text3">
<Anything/>
</myXMLTag>
我在http://regexstorm.net/tester上尝试了一些常规表达式,但它总是标记前两个<myXMLTag>
,而不仅仅是中间的。{/ p>
模式:
<myXMLTag.*Text1.+(ISHOULDNOTBEHERE)+.*?</(myXMLTag)>
我需要一个模式,它只能在XML字符串中找到XML元素,看起来像中间的那样。
答案 0 :(得分:1)
使用正则表达式解析XML绝对不是一个好主意。这样的剪枝只有很小的空间。
那说,试试这样:
<(myXMLTag)\s+id="[^"]+(ISHOULDNOTBEHERE)(?:(?!</\1>).)+</\1>
<强>解释强>
<(myXMLTag)\s+id="
充当起始锚[^"]+
否定范围与"
ISHOULDNOTBEHERE
显然是您的关键字(?!</\1>).)+
tempered greedy token匹配除了使用后引用的结束标记之外的所有内容</\1>
结束标记,再次使用后向引用答案 1 :(得分:1)
对使用正则表达式解析XML的问题的标准回答是
RegEx match open tags except XHTML self-contained tags
这个答案可能看起来过于顶层,但这是合理的:我们大多数人都看到了如果你尝试这种情况会产生的灾难性后果。基本上,任何试图使用正则表达式处理XML的程序都会很慢而且有问题。如果你想快速得到结果并且不介意错误,那么请继续 - 并确保你不会长时间留在项目中以承担后果。
使用XML解析器,它是正确的工具。
答案 2 :(得分:0)
这有点难看,但只要你尊重你的例子中的模式就应该有效:
.+ISHOULDNOTBEHERE.+\n.+\n<\/myXMLTag>
在此处测试regex101