RegEx替换为无效的数字字符引用

时间:2016-01-08 12:35:30

标签: c# regex xml

在Xml文档中替换无效的数字字符引用需要一些严肃的RegEx帮助。

由于XmlWriter中的一个已知错误,当​​您编写XML实体时,分号会被删除,因此我们使用的某些Xml数据生成无法读取。不幸的是,由于一些奇怪的原因,生产环境没有在最新的.Net框架上运行,导致相当多的这类数据被插入到数据库中,现在我必须找到一个修复用于回读和修复这些数据不知何故。

误解XML的示例(在下面的XML中查找&#xE1d& &#x3A3 ):

<TestInvalidUnicodeReading Desc="a&#xF1;o &#x20AC;  &#x3A3 &#xC6; Jako efektivn&#x11;B;j&#x161;&#xED; se n&#xE1;m jev&#xED; po&#x159&#xE1d&#xE1;n&#xED; tzv. st&#x159ed;nictv&#xED;m na&#x161;ich an&#xFDc;h dealer&#x16F; v &#x10Cec;h&#xE1c;h a na Morav&#x11;B, kter&#xE9; prob&#x11;Bhnou v pr&#x16Fb;&#x11;Bhu z&#xE1;&#x159;&#xED; a &#x159;&#xEDjna.bddb26e234c5452aab7720c581e137f7" />

现在为了解决这个问题,我设计了以下RegEx solution并在C#中使用它来查找匹配并添加缺少的分号,这部分有效:

&((?:#([0-9]+)|#x([0-9a-fA-F]+)|([0-9a-zA-Z]+))[?&0-9a-zA-Z ])

现在问题出在&amp;#xE1d&amp; 部分。

enter image description here

因为当RegEx上面的匹配与之前的匹配时,下一个&amp;#xE1d&amp; 将被跳过。有人可以帮我找一个解决这个RegEx问题的方法吗?

1 个答案:

答案 0 :(得分:2)

我认为您可以使用negative lookahead assertion

来改进正则表达式
&(#[0-9]+(?![0-9;])|#x[0-9a-fA-F]+(?![0-9a-fA-F;]))

仅匹配未跟;后跟的数字字符引用。

<强>解释

&                 # Match &
(                 # Start of capturing group:
 #[0-9]+          # Match either # plus digits  
 (?![0-9;])       # as long as they are not followed by a semicolon or more digits
|                 #
 #x[0-9a-fA-F]+   # match #x plus hex digits
 (?![0-9a-fA-F;]) # as long as they are not followed by semicolon or hex
)                 # End of group

测试live on regex101.com