RegEx Notepad++:使用查找替换向 XML 属性值添加引号
RegEx Notepad++: add quotes to XML attribute values using find replace
我有一个 XML 文件,其中的属性值没有双引号。以下是示例。如您所见,这些是可能的值,我尝试使用正则表达式 *=\s*([^" >]+)
并替换为 =""
这在大多数情况下都有效,但它有两个问题。
任何有关这些的帮助将不胜感激。
- 它不会用双引号 ("") 替换空值 (eg.status)。
- 仅当值具有sentence.eg(描述)
时才替换第一个词
示例输入:
<tool id=2 code=abc description=my description end here my_levels=,000/,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=",000/,000" individual_level="" amount="0" status="" my_code="P" my_date="2017-02-21T00:00:00" points="" />
这可能超出了正则表达式的范围,但只要您的值中绝对没有任何等号,以下内容就应该有效:
搜索:\b(\w+)=((?:\s*[^=>]+\b(?!=))+)?(\s+|\/?>)
替换:=""
\b
匹配单词边界 http://www.regular-expressions.info/wordboundaries.html
(\w+)
匹配一个或多个单词字符并捕获为 'group 1' - 在替换中引用为 </code></li>
<li><code>(
start 'group 2' - 在替换中引用为 $2
(?:
开始一个组,但不捕获 - 我们这样做是为了在最后使用 +
字符重复
\s*
匹配零个或多个空白字符
[^=>]+
匹配一个或多个不是 =
或 >
的字符
\b
匹配另一个单词边界 - 没有这个它将继续匹配下一个 属性 的一部分
(?!=)
确保下一个字符不是 =
这被称为负先行 - 小心这些,它们是使正则表达式效率低下的好方法。 http://www.regular-expressions.info/lookaround.html
)+
关闭非捕获组,匹配1次或多次
)?
关闭组 2 并使用 ?
字符 使其可选
(\s+|/?>)
确保它以空格或标记结尾 - 将其捕获为 'group 3' - 在替换中用作 </code>
<ul>
<li><code>\s+
空格或
/?
自闭合标签的可选正斜杠
>
标签结束
在此处查看实际效果:https://regex101.com/r/zYdzQB/2
一些注意事项:
- 您需要仔细检查结果
- 你不应该自动执行此操作,这不是解决问题的有效方法,但如果你有损坏的文件需要修复,那么它可能是合适的。
- 如果您有任何机会查看数据的生成方式并修复此问题,那么您最好这样做。
我有一个 XML 文件,其中的属性值没有双引号。以下是示例。如您所见,这些是可能的值,我尝试使用正则表达式 *=\s*([^" >]+)
并替换为 =""
这在大多数情况下都有效,但它有两个问题。
任何有关这些的帮助将不胜感激。
- 它不会用双引号 ("") 替换空值 (eg.status)。
- 仅当值具有sentence.eg(描述) 时才替换第一个词
示例输入:
<tool id=2 code=abc description=my description end here my_levels=,000/,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=",000/,000" individual_level="" amount="0" status="" my_code="P" my_date="2017-02-21T00:00:00" points="" />
这可能超出了正则表达式的范围,但只要您的值中绝对没有任何等号,以下内容就应该有效:
搜索:\b(\w+)=((?:\s*[^=>]+\b(?!=))+)?(\s+|\/?>)
替换:=""
\b
匹配单词边界 http://www.regular-expressions.info/wordboundaries.html(\w+)
匹配一个或多个单词字符并捕获为 'group 1' - 在替换中引用为</code></li> <li><code>(
start 'group 2' - 在替换中引用为 $2(?:
开始一个组,但不捕获 - 我们这样做是为了在最后使用+
字符重复\s*
匹配零个或多个空白字符[^=>]+
匹配一个或多个不是=
或>
的字符
\b
匹配另一个单词边界 - 没有这个它将继续匹配下一个 属性 的一部分
(?!=)
确保下一个字符不是=
这被称为负先行 - 小心这些,它们是使正则表达式效率低下的好方法。 http://www.regular-expressions.info/lookaround.html
)+
关闭非捕获组,匹配1次或多次
)?
关闭组 2 并使用?
字符 使其可选
(\s+|/?>)
确保它以空格或标记结尾 - 将其捕获为 'group 3' - 在替换中用作</code> <ul> <li><code>\s+
空格或/?
自闭合标签的可选正斜杠>
标签结束
在此处查看实际效果:https://regex101.com/r/zYdzQB/2
一些注意事项:
- 您需要仔细检查结果
- 你不应该自动执行此操作,这不是解决问题的有效方法,但如果你有损坏的文件需要修复,那么它可能是合适的。
- 如果您有任何机会查看数据的生成方式并修复此问题,那么您最好这样做。