正则表达式修复格式错误的 XML 属性,删除标签中的空格

问题描述 投票:0回答:1

我很不幸遇到了很多格式错误的 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 个空格,同时又避免这些值 感谢任何可以提供帮助的正则表达式英雄...!

这里是regex101https://regex101.com/r/dVs51I/3

c# regex regex-lookarounds regex-group regexp-replace
1个回答
0
投票

查看您的模式,您想要:

  • <[^=]+?>
    确保
    =
     之间没有 
    <...>
  • (?=</?\w+\s+\w+)
    确保第一个字符是
    <
    </
    之后的单词字符,并且至少有一个空格字符和第二个单词字符
  • (<.*?)(\s+)(.*?>)
    匹配
    <...>
  • 之间的 1 个或多个空白字符

这里的问题是

(<.*?)(\s+)(.*?>)
将只有一个匹配项。

此外,当您有

<test ></test >
时,您将不会匹配最后一个空格,因为只有一个单词。


注意,这是给定的示例,并不是万无一失的 xml 的多功能性。

使用 C#,您可以在后行断言中使用无限量词来获取多个匹配项。

(?<=</?\s*\w[^<>=]*)\s+(?=[^=<>]*>)

模式匹配:

  • (?<=
    正向后看,断言左边是
    • </?
      匹配
      <
      </
    • \s*\w
      匹配可选的空白字符,后跟单个单词字符
    • [^<>=]*
      可选择重复匹配除
      <
      之外的任何字符
      >
      =
  • )
    关闭lookbehind断言
  • \s+
    匹配 1 个或多个空白字符
  • (?=
    正向前瞻,断言右侧是
    • [^=<>]*
      可选择重复匹配除
      <
      之外的任何字符
      >
      =
  • >)
    匹配
    >

查看 C# 正则表达式演示

© www.soinside.com 2019 - 2024. All rights reserved.