有条件地删除可变字符串正则表达式

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 标签。如果没有,您最终会得到损坏的数据,这就是为什么解析器是更好的解决方案的原因之一。