带变量字符串regex的条件删除

带变量字符串regex的条件删除,regex,textpad,Regex,Textpad,我已经搜索了许多Q&a,但找不到足够具体的解决方案来提供帮助 我有一个很大的xml文件,需要根据另一个字段中的值在一个字段中执行有条件的“删除” 例如: <vehicle>...<manufacturer>JCB</manufacturer>....<item_category>JCB Tractors</item_category>...</vehicle><vehicle>...<manufacture

我已经搜索了许多Q&a,但找不到足够具体的解决方案来提供帮助

我有一个很大的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>
…JCB…JCB拖拉机…Caterpillar…挖掘机…Caterpillar…挖掘机。。。
需要成为

<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>
…JCB…拖拉机……履带……挖掘机……履带……挖掘机。。。
理想情况下,我可以使用textpad中的查找和替换功能将解决方案设置为POSIX扩展正则表达式

真的很感谢你在这个问题上的帮助,因为我已经撞了我的头一段时间了

如果我使用解析器,我可以使用

(?<=<manufacturer>)(.*?)(?=<\/manufacturer>)

(?使用解析器的建议非常恰当

处理regex中的标记可能是一场噩梦。一些程序在大型文本文件中的regex模式下失败,并开始损坏位。请确保首先备份您的工作

但我同时看到了一个机会,可以从中获得一些乐趣。这只是因为制造商名称与商品类别的第一部分相同

演示:

解释

(\<manufacturer>([^<]*)<\/manufacturer>)(\s*)(\<item_category>)(?:\2\s*)?([^<]*)(<\/item_category>)
(\([^
)#关闭CG6

将演示中相当于两个标记之间的空格的
(\s*)
,更改为
([\s\s]*?)
应该处理你的问题没有提供的所有标签,但是要求每个车辆标签都有一个制造商和项目类别标签。如果没有,你最终会得到损坏的数据,这就是为什么解析器是更好的解决方案的一个原因。

我的建议是使用XML解析器而不是regex。你能请解释更多您想要实现的目标。谢谢回复-我正在努力保持较大的容量(1GB)xml文件完好无损,并修复偶尔使用制造商字符串和类别填充的“损坏”类别字段。不过您的示例不清楚。您好-我已经调整了示例。我刚刚显示了相关字段,“点”表示记录中的许多其他字段。非常感谢。我的XML没有嵌套,字段顺序一致且始终存在,因此这种方法应该可以。我可以让正则表达式在诸如textpad之类的工具中很好地工作,但是在textpad中它似乎不起作用。分解正则表达式以查看(\([^
(\<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