2017-02-23 72 views
-1

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

  1. 它不会用双引号(“”)替换空值(eg.status)。
  2. 它取代仅当值具有sentence.eg的第一个字(介绍)

样品输入:

<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="" /> 
+0

你可能不会用正则表达式来解决这个问题。生成无效的XML已经丢弃了一些信息。由于属性值可能包含等号符号(不能确定它们没有),因此存在无法解析的歧义。唯一合理的解决方案是在源代码处修复XML的生成,这是属性值明确已知的地方。 –

+0

我相信我们没有=在xml中的值。 – KKR

回答

1

这可以超出正则表达式,但只要你的值中没有任何等号就可以工作:

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

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

  • \b字边界匹配
  • (\w+)匹配的一个或多个单词字符并捕获为 '组1' - 中所引用的替换作为$1
  • (开始“组2” - 在替换中引用为$ 2
    • (?:启动组,但不捕获 - 我们这样做,所以我们可以使用+炭末重复
      • \s*匹配零个或多个空白字符是
      • [^=>]+匹配一个或多个字符不=>
      • \b匹配一个字边界 - 没有这个它将继续匹配下一财产的一部分
      • (?!=)可以确保未来茶类别不是=这被称为负面预测 - 要小心这些,它们是使正则表达效率低下的好方法。http://www.regular-expressions.info/lookaround.html
    • )+关闭非捕获组,和与之相匹配的一个或多个次
  • )?关闭第2组,并使其可选使用?字符
  • (\s+|/?>)确保它与空白结束或标签的结尾 - 将其捕获为“组3” - 用于替换$3
    • \s+空白或自我结束标记标签的
    • >结束
    • /?可选的斜杠

看到它在这里的行动:https://regex101.com/r/zYdzQB/2

一些注意事项:

  • 你会需要仔细检查结果
  • 你不应该自动化这个,它不是一个解决问题的有效方法,但是如果你有一个破损的文件来修复,那么它可能是合适的。
  • 如果您有任何检查数据生成方式的可能性并修复此问题,那么最好不要这样做。
+0

尝试了它,但没有正确地将引号添加到结束标记旁边的值。例如points =“3”> – KKR

+0

我已经更新了答案和链接的正则表达式来应对这个问题 – Theo

+0

非常感谢!你太棒了.. – KKR