繁体   English   中英

用于特定XML元素的正则表达式

[英]Regex for specific XML Elements

在我的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>而不只是中间的一个。

图案:

<myXMLTag.*Text1.+(ISHOULDNOTBEHERE)+.*?</(myXMLTag)>

我需要一个模式,该模式只能在XML字符串中找到XML元素,看起来像中间的一个。

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

也就是说,像这样尝试:

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

演示版

说明

  • <(myXMLTag)\\s+id="作为开始锚点
  • [^"]+否定范围,与除"
  • ISHOULDNOTBEHERE显然是您的关键字
  • (?!</\\1>).)+ 修饰的贪婪令牌 ,使用反向引用匹配除end标签之外的所有内容
  • </\\1>结束标签,再次使用反向引用

关于使用正则表达式解析XML的问题的标准答案是

RegEx匹配XHTML自包含标签以外的打开标签

这个答案似乎是最重要的,但这是有道理的:我们大多数人已经看到,如果尝试这种方法,可能会导致灾难性的后果。 基本上,任何尝试使用正则表达式来处理XML的程序都会很慢且容易出错。 如果您想快速获得结果并且不介意错误,请继续-并确保您在项目中的停留时间不够长,以免造成后果。

使用XML解析器,这是完成任务的正确工具。

这有点难看,但是只要您尊重示例中的模式,它就应该起作用:

.+ISHOULDNOTBEHERE.+\n.+\n<\/myXMLTag>

在这里测试regex101

  • 从一行开始,匹配1个或多个任意字符(。+)
  • 识别文字ISHOULDNOTBEHERE
  • 消耗所有字符,直到\\ n(。+ \\ n)
  • 在下一行使用1个或更多字符,然后该行跳到下一个(。+ \\ n)
  • 识别文字</ myXMLTag>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM