【问题标题】:RegEx Notepad++: add quotes to XML attribute values using find replaceRegEx Notepad++:使用查找替换为 XML 属性值添加引号
【发布时间】:2017-02-23 20:02:14
【问题描述】:

我有一个属性值没有双引号的 XML 文件。以下是一个示例。如您所见,这些是可能的值,我尝试使用正则表达式 *=\s*([^" >]+) 并替换为 ="\1",这在大多数情况下都有效,但有两个问题。
任何有关这些的帮助将不胜感激。

  1. 它不会用双引号(“”)替换空值(例如.status)。
  2. 只有当值有句子时才会替换第一个单词。eg(description)

示例输入:

<tool id=2 code=abc description=my description end here my_levels=$15,000/$30,000 individual_level= amount=0 status= my_code=P my_date=2017-02-21T00:00:00 points= />

预期结果:

<tool id="2" code="123abc" description="my description end here" my_levels="$15,000/$30,000" individual_level="" amount="0" status="" my_code="P" my_date="2017-02-21T00:00:00" points="" />

【问题讨论】:

  • 您可能无法使用正则表达式解决此问题。无效 XML 的生成丢弃了一些信息。存在无法解决的歧义,因为可以想象属性值可能包含等号字符(您不能确定它们不包含)。唯一合理的解决方案是在源处修复 XML 的生成,这是明确知道属性值的地方。
  • 我确信我们在 xml 中没有 = 值。

标签: regex xml notepad++ xml-attribute find-replace


【解决方案1】:

这可能超出了正则表达式,但只要您的值中绝对没有任何等号,以下应该可以工作:

搜索:\b(\w+)=((?:\s*[^=&gt;]+\b(?!=))+)?(\s+|\/?&gt;)

替换:$1="$2"$3

  • \b 匹配单词边界 http://www.regular-expressions.info/wordboundaries.html
  • (\w+) 匹配一个或多个单词字符并捕获为“组 1” - 在替换中引用为 $1
  • ( start 'group 2' - 在替换中引用为 $2
    • (?: 开始一个组,但不捕获 - 我们这样做是为了可以使用 + 字符在末尾重复
      • \s* 匹配零个或多个空白字符
      • [^=&gt;]+ 匹配一个或多个不是= 或&gt; 的字符
      • \b 匹配另一个单词边界 - 没有这个它将继续匹配下一个属性的一部分
      • (?!=) 确保下一个字符不是 = 这被称为负前瞻 - 小心这些,它们是使正则表达式低效的好方法。 http://www.regular-expressions.info/lookaround.html
    • )+ 关闭非捕获组,并匹配一次或多次
  • )? 关闭组 2 并使用 ? 字符使其成为可选
  • (\s+|/?&gt;) 确保它以空格或标签结尾 - 将其捕获为 'group 3' - 在替换中使用 $3
    • \s+空格或
    • /? 自闭合标签的可选正斜杠
    • &gt; 标签结束

在此处查看实际操作:https://regex101.com/r/zYdzQB/2

一些注意事项:

  • 您需要仔细检查结果
  • 您不应该自动执行此操作,这不是解决问题的有效方法,但如果您要修复损坏的文件,那么它可能是合适的。
  • 如果您有机会查看数据的生成方式并解决此问题,您最好这样做。

【讨论】:

  • 试过了,但它没有正确地将引号添加到结束标记旁边的值中。例如 points="3">
  • 我已经更新了答案和链接的正则表达式来应对这个问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
  • 2020-09-21
  • 1970-01-01
  • 1970-01-01
  • 2011-03-02
  • 1970-01-01
  • 2014-09-19
相关资源
最近更新 更多