2014-10-11 78 views
0

我希望將標籤與名稱test匹配,但前提是它的名稱one中有兩個以上標籤在importantTag之內。僅在內部存在特定標籤時才匹配標籤

<test attribute="one"> 
    <unimportantTag> 
     <one>text</one> 
    </unimportantTag> 
    <importantTag> 
     <one>text</one> 
     <one>text</one> 
    </importantTag> 
</test> 

下面這一個不應該被匹配,因爲它不具有兩個one標籤importantTag

<test attribute="one"> 
    <unimportantTag> 
     <one>text</one> 
    </unimportantTag> 
    <importantTag> 
     <one>text</one> 
    </importantTag> 
</test> 
</root> 

我知道,那些那樣的東西不應該被解析使用正則表達式,但在這種情況下沒有其他辦法。
是否有可能使用正則表達式匹配整個測試標籤。這個例子被簡化了。

根據來自正則表達式的匹配,我想將attribute="one"替換爲屬性"replaced"

+0

使用HTML/XML解析器請。請從標籤列表中刪除其中的一個。 – nhahtdh 2014-10-11 15:29:51

+1

http://regex101.com/r/vF9sG0/2 – 2014-10-11 15:41:49

+0

@Avinash Raj - 非常感謝,我已經調整了你的模式,所以它可以在完整的文件上工作,而不是簡單的。剛剛還有一個問題。基於這個決定(即找到這個匹配),我想用屬性「one」的值替換別的可以說「替換」的單詞。既然我看到你在使用非捕獲組,是否有任何簡單的方法來實現它? – wariacik 2014-10-11 16:19:11

回答

0

基礎上被張貼@Avinash拉吉我建立的,我想一個確切的正則表達式的答案。我是最後的發帖解決方案,也許有人會覺得它有用。

Search pattern: 
(?s)(test)([^<>]*?)(attribute="one")(([^<>]*?)(?:(?!<\/test>).)*<importantTag>(?:(?!<\/test>|<\/importantTag>).)*<one>[^<>]*<\/one>[^<>]*<one>[^<>]*<\/one>(?:(?!<\/test>|<\/importantTag>).)*<\/importantTag>(?:(?!<\/test>).)*)<\/test> 

Replace pattern: 
$1$2attribute="replaced"$4>$5</test> 

http://regex101.com/r/wU2pT9/1

0

** **修改
嘗試這種模式

<test(?=(?:[^<]|<(?!\/test>))*<importantTag>(?=(?:(?:[^<]|<(?!\/test>))*<one>[^<]*<\/one>){2}))(?:[^<]|<(?!\/test>))*<\/test> 

Demo

+0

http://regex101.com/r/yW4aZ3/23 – vks 2014-10-11 16:06:56

+0

@ vks,你是對的,修改我的模式上面,謝謝指出 – 2014-10-11 21:01:42