-1

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

  1. 它不会用双引号(“”)替换空值(例如状态)。
  2. 仅当值有句子时才替换第一个单词。例如(描述)

样本输入:

<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="" />
4

1 回答 1

1

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

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

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

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

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

一些警告:

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