我有一个XML文件,属性值没有双引号。下面是一个示例。如您所见,这些是可能的值,我尝试使用正则表达式*=s*([^" >]+)
并替换为大部分有效的="1"
,但它有两个问题。
任何关于这些的帮助将不胜感激。
- 它不会用双引号(")替换空值(例如状态)。
- 仅当值具有 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="" />
这可能超出了正则表达式的范围,但只要您的值中绝对没有任何等号,以下内容应该可以工作:
搜索:b(w+)=((?:s*[^=>]+b(?!=))+)?(s+|/?>)
替换:$1="$2"$3
b
匹配单词边界 http://www.regular-expressions.info/wordboundaries.html(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
一些注意事项:
- 您需要仔细检查结果
- 您不应该自动执行此操作,这不是解决问题的有效方法,但是如果您要修复损坏的文件,那么它可能合适。
- 如果您有机会查看数据是如何生成的并解决此问题,那么您最好这样做。