我很不幸遇到了很多格式错误的 XML。
我无法获得正确的正则表达式来删除属性/键内的 2 个空格。
我当前的正则表达式还会检查是否存在有效的“=”属性。
XML 属性必须有一个值或 / 和一个键。
例如
<ImValid></ImValid>
<Im not Valid></Im not Valid>
<ImValid with="somthing"></ImValid>
这是我的格式错误的 XML:
<Addresses>
<Address>
<Delivery id>123123</Delivery id>
<Delivery Code Id>123123</Delivery Code Id>
<Full Name>Agent Smith</Full Name>
</Address>
<Address>
<Delivery id>12322123</Delivery id>
<Delivery Code Id>12zz3123</Delivery Code Id>
<Full Name>Mr Anderson</Full Name>
</Address>
<Addresses>
我正在尝试使用正则表达式修复它。
AstringVar => Regex.Replace(AstringVar , @"(?=<[^=]+?>)(?=</?\w+\s+\w+)(<.*?)(\s+)(.*?>)", @"$1$3", RegexOptions.CultureInvariant | RegexOptions.IgnoreCase)
这将改变这一切
<Full Name>Mr Anderson</Full Name>
这个
<FullName>Mr Anderson</FullName>
改进..但也缺少最后一个空格..
<DeliveryCode Id>12zz3123</DeliveryCode Id>
好吧...我可以运行两次...但是.. 看起来很丑... 我怎样才能同时获得 1 个空格和 2 个空格,同时又避免这些值 感谢任何可以提供帮助的正则表达式英雄...!
查看您的模式,您想要:
<[^=]+?>
确保 =
之间没有
<...>
(?=</?\w+\s+\w+)
确保第一个字符是 <
或 </
之后的单词字符,并且至少有一个空格字符和第二个单词字符(<.*?)(\s+)(.*?>)
匹配 <...>
这里的问题是
(<.*?)(\s+)(.*?>)
将只有一个匹配项。
此外,当您有
<test ></test >
时,您将不会匹配最后一个空格,因为只有一个单词。
注意,这是给定的示例,并不是万无一失的 xml 的多功能性。
使用 C#,您可以在后行断言中使用无限量词来获取多个匹配项。
(?<=</?\s*\w[^<>=]*)\s+(?=[^=<>]*>)
模式匹配:
(?<=
正向后看,断言左边是
</?
匹配 <
或 </
\s*\w
匹配可选的空白字符,后跟单个单词字符[^<>=]*
可选择重复匹配除 <
之外的任何字符 >
=
)
关闭lookbehind断言\s+
匹配 1 个或多个空白字符(?=
正向前瞻,断言右侧是
[^=<>]*
可选择重复匹配除 <
之外的任何字符 >
=
>)
匹配>
查看 C# 正则表达式演示。