我希望将代码与名称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 :(得分:0)
**修改**
尝试这种模式
<test(?=(?:[^<]|<(?!\/test>))*<importantTag>(?=(?:(?:[^<]|<(?!\/test>))*<one>[^<]*<\/one>){2}))(?:[^<]|<(?!\/test>))*<\/test>
答案 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>