在Xml文档中替换无效的数字字符引用需要一些严肃的RegEx帮助。
由于XmlWriter中的一个已知错误,当您编写XML实体时,分号会被删除,因此我们使用的某些Xml数据生成无法读取。不幸的是,由于一些奇怪的原因,生产环境没有在最新的.Net框架上运行,导致相当多的这类数据被插入到数据库中,现在我必须找到一个修复用于回读和修复这些数据不知何故。
误解XML的示例(在下面的XML中查找&#xE1d& 和&#x3A3 ):
<TestInvalidUnicodeReading Desc="año € Σ Æ Jako efektivnB;jší se nám jeví pořฝání tzv. st𕧭nictvím našich an࿜h dealerů v 𐳬hผh a na MoravB, které probBhnou v pr᛻Bhu září a října.bddb26e234c5452aab7720c581e137f7" />
现在为了解决这个问题,我设计了以下RegEx solution并在C#中使用它来查找匹配并添加缺少的分号,这部分有效:
&((?:#([0-9]+)|#x([0-9a-fA-F]+)|([0-9a-zA-Z]+))[?&0-9a-zA-Z ])
现在问题出在&amp;#xE1d&amp; 部分。
因为当RegEx上面的匹配与之前的匹配时,下一个&amp;#xE1d&amp; 将被跳过。有人可以帮我找一个解决这个RegEx问题的方法吗?
答案 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