特定XML元素的正则表达式

时间:2018-06-15 05:08:26

标签: c# regex xml

在我的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元素,看起来像中间的那样。

3 个答案:

答案 0 :(得分:1)

使用正则表达式解析XML绝对不是一个好主意。这样的剪枝只有很小的空间。

那说,试试这样:

<(myXMLTag)\s+id="[^"]+(ISHOULDNOTBEHERE)(?:(?!</\1>).)+</\1>

Demo

<强>解释

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

  • 开始一行,匹配1个或多个任何字符(。+)
  • 识别文字ISHOULDNOTBEHERE
  • 消耗任何字符,直到\ n(。+ \ n)
  • 在下一行中消耗1个或多个任何字符,并且该行跳转到下一行(。+ \ n)
  • 识别文字&lt; / myXMLTag&gt;