有条件地删除可变字符串正则表达式
conditional remove with variable string regex
我搜索了许多问答,但找不到足够具体的解决方案来提供帮助。
我有一个很大的 xml 文件,需要根据另一个字段中的值在一个字段中执行条件 'remove'。
例如:
<vehicle>...<manufacturer>JCB</manufacturer>....<item_category>JCB Tractors</item_category>...</vehicle><vehicle>...<manufacturer>Caterpillar</manufacturer>....<item_category>Digger</item_category>...</vehicle><vehicle>...<manufacturer>Caterpillar</manufacturer>....<item_category>Caterpillar Digger</item_category>...</vehicle>
需要成为
<vehicle>...<manufacturer>JCB</manufacturer>...<item_category>Tractors</item_category>...</vehicle><vehicle>...<manufacturer>Caterpillar</manufacturer>...<item_category>Digger</item_category>...</vehicle><vehicle>...<manufacturer>Caterpillar</manufacturer>....<item_category>Digger</item_category>...</vehicle>
理想情况下,我可以使用文本板中的查找和替换功能设置为 POSIX 扩展正则表达式来应用解决方案。
非常感谢对这个问题的帮助,因为我已经为此苦苦思索了一段时间!
如果我使用解析器,我可以使用
隔离我想要 'remove' 的变量字符串
(?<=<manufacturer>)(.*?)(?=<\/manufacturer>)
是否可以使用该模式来隔离我实际想要删除的字符串
例如,
(?<=<item_category>)(?<=<manufacturer>)(.*?)(?=<\/manufacturer>)(\s)
关于您使用解析器的建议很准确。
处理正则表达式中的标签可能是一场噩梦。一些程序在大型文本文件中的正则表达式模式失败并开始破坏位。请务必先备份您的工作。
但我同时看到了一个从中获得乐趣的机会。这是可能的,因为制造商名称与 item_category.
的第一部分相同
演示:https://regex101.com/r/rO7pM0/1
说明
(\<manufacturer>([^<]*)<\/manufacturer>)(\s*)(\<item_category>)(?:\s*)?([^<]*)(<\/item_category>)
解释:
( # Opens CG1
\<manufacturer> # Literal
( # Opens CG2
[^<]* # Negated Character class (excludes the characters within)
# None of: <
# * repeats zero or more times
) # Closes CG2
< # Literal <
\/ # Literal /
manufacturer # Literal manufacturer
> # Literal >
) # Closes CG1
( # Opens CG3
\s* # Token: \s (white space)
# * repeats zero or more times
) # Closes CG3
( # Opens CG4
\<item_category> # Literal
) # Closes CG4
(?: # Opens NCG
# A backreference to CG2
\s* # Token: \s (white space)
# * repeats zero or more times
)? # Closes NCG
# ? repeats zero or one times
( # Opens CG5
[^<]* # Negated Character class (excludes the characters within)
# None of: <
# * repeats zero or more times
) # Closes CG5
( # Opens CG6
< # Literal <
\/ # Literal /
item_category # Literal item_category
> # Literal >
) # Closes CG6
将 (\s*)
(在演示中等同于两个标签之间的 space)更改为 ([\s\S]*?)
应该可以处理您的问题未提供的所有标签,但是要求 每个车辆标签都有制造商和 item_category 标签。如果没有,您最终会得到损坏的数据,这就是为什么解析器是更好的解决方案的原因之一。
我搜索了许多问答,但找不到足够具体的解决方案来提供帮助。
我有一个很大的 xml 文件,需要根据另一个字段中的值在一个字段中执行条件 'remove'。
例如:
<vehicle>...<manufacturer>JCB</manufacturer>....<item_category>JCB Tractors</item_category>...</vehicle><vehicle>...<manufacturer>Caterpillar</manufacturer>....<item_category>Digger</item_category>...</vehicle><vehicle>...<manufacturer>Caterpillar</manufacturer>....<item_category>Caterpillar Digger</item_category>...</vehicle>
需要成为
<vehicle>...<manufacturer>JCB</manufacturer>...<item_category>Tractors</item_category>...</vehicle><vehicle>...<manufacturer>Caterpillar</manufacturer>...<item_category>Digger</item_category>...</vehicle><vehicle>...<manufacturer>Caterpillar</manufacturer>....<item_category>Digger</item_category>...</vehicle>
理想情况下,我可以使用文本板中的查找和替换功能设置为 POSIX 扩展正则表达式来应用解决方案。
非常感谢对这个问题的帮助,因为我已经为此苦苦思索了一段时间!
如果我使用解析器,我可以使用
隔离我想要 'remove' 的变量字符串(?<=<manufacturer>)(.*?)(?=<\/manufacturer>)
是否可以使用该模式来隔离我实际想要删除的字符串
例如,
(?<=<item_category>)(?<=<manufacturer>)(.*?)(?=<\/manufacturer>)(\s)
关于您使用解析器的建议很准确。
处理正则表达式中的标签可能是一场噩梦。一些程序在大型文本文件中的正则表达式模式失败并开始破坏位。请务必先备份您的工作。
但我同时看到了一个从中获得乐趣的机会。这是可能的,因为制造商名称与 item_category.
的第一部分相同演示:https://regex101.com/r/rO7pM0/1
说明
(\<manufacturer>([^<]*)<\/manufacturer>)(\s*)(\<item_category>)(?:\s*)?([^<]*)(<\/item_category>)
解释:
( # Opens CG1
\<manufacturer> # Literal
( # Opens CG2
[^<]* # Negated Character class (excludes the characters within)
# None of: <
# * repeats zero or more times
) # Closes CG2
< # Literal <
\/ # Literal /
manufacturer # Literal manufacturer
> # Literal >
) # Closes CG1
( # Opens CG3
\s* # Token: \s (white space)
# * repeats zero or more times
) # Closes CG3
( # Opens CG4
\<item_category> # Literal
) # Closes CG4
(?: # Opens NCG
# A backreference to CG2
\s* # Token: \s (white space)
# * repeats zero or more times
)? # Closes NCG
# ? repeats zero or one times
( # Opens CG5
[^<]* # Negated Character class (excludes the characters within)
# None of: <
# * repeats zero or more times
) # Closes CG5
( # Opens CG6
< # Literal <
\/ # Literal /
item_category # Literal item_category
> # Literal >
) # Closes CG6
将 (\s*)
(在演示中等同于两个标签之间的 space)更改为 ([\s\S]*?)
应该可以处理您的问题未提供的所有标签,但是要求 每个车辆标签都有制造商和 item_category 标签。如果没有,您最终会得到损坏的数据,这就是为什么解析器是更好的解决方案的原因之一。