2015-08-17 159 views
0

Regex的捕獲重疊的匹配所以我需要一個正則表達式,其可以收集從信道,其中所述Cid是由idvisibility多個可變配對共享Cididvisibility屬性值。我似乎只能搶到第一場比賽(0136, 10000, 21),而不是第二場或任何其他賽事比賽,例如(0136, 5000, 21)。請記住,XML有多個通道。具有固定點

<channel Cid="0x0136"> 
    <type>A</type> 
    <characteristics var1="0.1" var2="V" var3="3"> 
     <custom_range id="10000" visibility="21"></custom_range> 
     <custom_range id="5000" visibility="21"></custom_range> 
    </characteristics>  
    <visibility>0</visibility> 
</channel> 

我的正則表達式是:

/\bCid?\b="0x([0-9a-fA-F]+)"(?=(?!Cid)(?s).*id="([0-9]+)" visibility="([0-9]+)")/g 
+0

有一個結束標記太多。我編輯和格式化了這個例子。這更好嗎? – buckley

回答

0

一個正則表達式匹配一些文本,如果成功嘗試再次啓動,在最後一場比賽結束。

所以你會有你的CID匹配一次,並且ID &可見性捕獲幾次。問題是你只能訪問最後一次捕獲(.NET是一個例外)。

也許XPATH允許一個更強大或更優雅的解決方案,但我從來沒有拿起它。

用一個正則表達式,你可以先用

Cid="(.*?)"(.*?)</channel> 

現在的CID是在第1組和應用上組另一個正則表達式2

id="(.*?)".*?visibility="(.*?)" 

編號爲第1組和知名度在第2組

你可以用任何命令式語言使用2行內的幾行代碼來編寫你的三元組。

+0

謝謝!我現在決定只使用Java XML解析器。雖然我很高興知道這方面的正則表達式的限制。 –