我搜索过多个Q& As,但找不到足够有用的解决方案。
我有一个大的xml文件,需要在一个字段中执行条件“删除”,具体取决于另一个字段中的值。
例如:
<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>
理想情况下,解决方案是我可以使用在POSOP扩展正则表达式中设置的查找和替换功能来应用的。
真的非常感谢这方面的帮助,因为我一直在抨击它一段时间!
如果我使用解析器,我可以使用
隔离我想要“删除”的变量字符串(?<=<manufacturer>)(.*?)(?=<\/manufacturer>)
是否可以使用该模式来隔离我实际想要删除的字符串
如,
(?<=<item_category>)(?<=<manufacturer>)(.*?)(?=<\/manufacturer>)(\s)
答案 0 :(得分:2)
您使用解析器的建议现场。
处理正则表达式中的标签可能是一场噩梦。有些程序在大文本文件中以正则表达式模式失败并开始破坏这些位。确保先备份你的工作。
但我同时看到了一个有机会玩这个的机会。这是唯一可能的,因为制造商名称与item_category的第一部分相同。
DEMO:https://regex101.com/r/rO7pM0/1
解释
(\<manufacturer>([^<]*)<\/manufacturer>)(\s*)(\<item_category>)(?:\2\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
\2 # 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*)
(在演示中等同于两个代码之间的空格)更改为([\s\S]*?)
,应处理您的问题未提供的所有标记,但需要每个车牌都有一个制造商和item_category标签。如果没有,您最终会得到损坏的数据,这是解析器是更好的解决方案的一个原因。