1

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

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

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

<wp:comment_approved>0</wp:comment_approved> 

而不是其中包含:

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

所以我需要一个lookaraound(向前看或向后看)或条件表达式,但我做错了。当我尝试:

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

它在一次选择中选择了比它应该选择的更多元素。

这似乎很简单,但我无法在任何地方找到正确的答案。

4

2 回答 2

1

我想这会起作用:

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

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

于 2014-05-05T12:16:47.180 回答
1

好的,解释了问题的答案。仅查找未批准的评论。

<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>.

所以:

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

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

找到子模式

找到剩下的

找到终点(主要模式)

于 2014-05-06T08:31:38.897 回答