仅当内部存在某个标记时才匹配标记

时间:2014-10-11 15:27:37

标签: xml regex parsing

我希望将代码与名称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"

2 个答案:

答案 0 :(得分:0)

**修改**
尝试这种模式

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

Demo

答案 1 :(得分:0)

基于@Avinash Raj发布的答案,我构建了一个我想要的精确正则表达式。我是最终发布解决方案,也许有人会发现它很有用。

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