2015-04-23 57 views
4

我已经搜索了一些Q &作为和找不到具体的解决方案足以帮助。条件删除变量字符串正则表达式

我有一个很大的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> 

理想的解决办法是什么我可以申请使用find和textpad设置为POSIX替换功能扩展的正则表达式。

真的很感谢帮助,因为我一直在抨击我的头一阵子!

如果我使用的解析器,我可以隔离变量字符串我想“删除”使用

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

是否有可能使用该模式其实我是想删除

串隔离例如,

(?<=<item_category>)(?<=<manufacturer>)(.*?)(?=<\/manufacturer>)(\s) 
+3

使用XML解析器而不是正则表达式是我的建议。你能解释更多你想实现什么 –

+0

感谢您的回复 - 我试图保持大(1GB)的XML文件完好无损,并修复了偶尔填充制造商字符串以及类别的“损坏”类别字段 – Eric

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

+0

非常感谢。我的XML没有嵌套和字段是一致的顺序,并始终存在,所以这种方法应该没问题。 – Eric

+0

我可以使用https://regex101.com/这样的工具很好地运行正则表达式,但是在textpad中它似乎不起作用。打破正则表达式只看 (\ ([^ <] *)<\/manufacturer>)([\ s \ S] *?)(\ ) 它工作正常找到捕获组1和2,但是不能处理CG 3和4 - 任何想法? – Eric

+0

设法让它工作 - 再次感谢! – Eric

相关问题