使用正则表达式从字符串中删除属性值不是特定值的所有 xml 节点

Posted

技术标签:

【中文标题】使用正则表达式从字符串中删除属性值不是特定值的所有 xml 节点【英文标题】:Remove all xml nodes where attribute value is not of specific values from string with regex 【发布时间】:2021-08-07 02:08:45 【问题描述】:

我想删除名称不是多个值的所有 xml 节点:

<Property Name="Operation" Type="String" Access="ReadWrite" Value="ProduceFile" />
<Property Name="BackOfficeType" Type="String" Access="ReadWrite" Value="growBusiness Solutions" />
<Property Name="module" Type="String" Access="ReadWrite" Value="Document" />
<Property Name="vti_pluggableparserversion" Type="String" Access="ReadOnly" Value="16.0.0.20405" />
<Property Name="_Author" Type="String" Access="ReadWrite" Value="hfhf fghfgh" />
<Property Name="modifiedBy" Type="String" Access="ReadWrite" Value="fghfghfghfg" />
<Property Name="vti_parserversion" Type="String" Access="ReadOnly" Value="16.0.0.20405" />

如果名称不是操作或模块,如何使用正则表达式删除上面的所有元素?

我在想这样的事情:

xml = Regex.Replace(xml, @"<Property Name=""(?!Operation |module)"".*?/>", "");

但这不起作用。

【问题讨论】:

那么它在做什么?它会抛出错误吗?它删除的内容是否超出了您的预期?没有删除您期望的所有内容?留下空行? 它什么也没做。我的正则表达式不起作用。我希望它是 NOT 部分。 我已经添加了实际的答案和解释! 【参考方案1】:

我不明白为什么,因为" 不是 C# 正则表达式系统中的特殊字符,但是删除第二个引号和 Operation 之后的空格使其工作(这是没有必要的转义):

<Property Name="(?!Operation|module).*?/>

如果我弄清楚第二个引用发生了什么,我会更新这个答案。

编辑:嗯,我觉得自己没有注意到这一点是个傻瓜。我的一个朋友指出,通过使用Name="(?!Operation|module)",它基本上表示“仅在Name="" 上匹配。如果您将以下示例添加到您的示例数据中,您会看到正在发生的事情:

<Property Name="" Type="String" Access="ReadOnly" Value="16.0.0.20405" />

因此在引号内添加另一个通配符将允许它匹配所有没有“操作”或“模块”的条目:

<Property Name="(?!Operation|module).*".*?/>

但是,这引发了一个新问题,即现在如果您有Name="Operation Awesome",过滤组也会忽略它。因此,必须以某种方式更改负前瞻,以专门忽略确切的单词,而不是简单地包含单词的属性名称。那么我们该怎么做呢?

<Property Name=(?!"Operation"|"module").*?/>

这确保它只保留"Operation""module" 的精确匹配。现在出现的唯一副作用是它将删除任何格式错误的 XML,例如 PropertyName="Operation Type="string"。您可能会认为这是负面的,但如果您希望能够处理无效的 XML,您应该在此之前使用另一种方法。

【讨论】:

以上是关于使用正则表达式从字符串中删除属性值不是特定值的所有 xml 节点的主要内容,如果未能解决你的问题,请参考以下文章

如何使用正则表达式从熊猫数据框中的一行中的字符串中提取所有特定值?

pyspark:删除作为另一列值的子字符串,并从给定列的值中包含正则表达式字符

正则表达式根据其中的值获取特定匹配括号后的所有内容

根据十六进制值从字符串中删除特定字符

使用正则表达式从 HTML 中提取所有值

使用正则表达式从 JSON 中删除具有给定属性的对象