2015-04-23 56 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

相關問題