使用变量字符串正则表达式

时间:2015-04-23 13:27:29

标签: regex textpad

我搜索过多个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)

1 个答案:

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