正则表达式,找到具有某些子节点的xml节点(在Sublime Text中)

时间:2014-05-05 11:10:55

标签: xml regex sublimetext lookaround

我正在寻找正则表达式(对于Sublime Text)来选择具有某个子元素的xml元素。 我可以用这个选择所有元素:

(?s)<wp:comment>.+?</wp:comment>

这很完美,但我想找到包含

的块
<wp:comment_approved>0</wp:comment_approved> 

而不包含:

<wp:comment_approved>1</wp:comment_approved>

所以我需要一个看起来(向前看或向后看)或条件表达,但我不能正确。 当我尝试:

(?s)<wp:comment>.+?comment_approved>1.+?</wp:comment>   

它在一个选择中选择的元素多于它应该的元素。

看起来很简单,但我无法在任何地方找到正确答案。

2 个答案:

答案 0 :(得分:1)

我认为这样可行:

(?s)<wp:comment>(?:(?!<wp:comment>).)+?+<wp:comment_approved>0.+?+</wp:comment>

注意所有格匹配(.+?+)以避免不必要的回溯。

答案 1 :(得分:1)

Oke,问题的答案解释了。 只查找未经批准的评论。

<xml>
    <node>bla</node>
    <wp:comment>
        <node>bla</node>
        <node>bli</node>
        <wp:comment_approved>1</wp:comment_approved>
        <node></node>
        <node></node>
    </wp:comment>
    <wp:comment>
        <node>ble</node>
        <node>blu</node>
        <wp:comment_approved>0</wp:comment_approved>
        <node></node>
        <node></node>
    </wp:comment>
</xml>

这是Sublime Text中的xml中正则表达式的语法:

(?s)<wp:comment>(?:(?!<wp:comment>).)+?<wp:comment_approved>0.+?</wp:comment>

(?s)           -> global search and multiline
<wp:comment>   -> find occurrence
(?: ... )      -> group but do not capture submatch 
(?! ... )      -> negative lookahead
<wp:comment>(?:(?!<wp:comment>).)+? 
               -> find <wp:comment> plus everything 
                  until a new <wp:comment> starts. 
                  This is for not select two or more comments 
                  in one time.
<wp:comment_approved>0.+?</wp:comment> 
               -> then find '<wp:comment_approved>0' 
                  Plus everything, then find </wp:comment>.

所以:

首先找到开始(主模式)然后

找到一切,但不是一个新的开始

找到子模式

找到其余的

找到结束(主模式)