regex,查找具有特定子节点的xml节点(在升华文本中)

regex,查找具有特定子节点的xml节点(在升华文本中),xml,regex,sublimetext,lookaround,Xml,Regex,Sublimetext,Lookaround,我正在寻找正则表达式(用于升华文本)来选择具有特定子元素的xml元素。 我可以使用此选项选择所有元素: (?s)<wp:comment>.+?</wp:comment> (?s)。+? 这是完美的,但我想找到包含 <wp:comment_approved>0</wp:comment_approved> 0 不包括: <wp:comment_approved>1</wp:comment_approved> 1 所

我正在寻找正则表达式(用于升华文本)来选择具有特定子元素的xml元素。 我可以使用此选项选择所有元素:

(?s)<wp:comment>.+?</wp:comment>
(?s)。+?
这是完美的,但我想找到包含

<wp:comment_approved>0</wp:comment_approved> 
0
不包括:

<wp:comment_approved>1</wp:comment_approved>
1
所以我需要一个lookaround(向前看或向后看)或条件表达式,但我不能正确地得到它。 当我尝试时:

(?s)<wp:comment>.+?comment_approved>1.+?</wp:comment>   
(?s)。+?注释批准>1.+?
它在一次选择中选择的图元多于它应该选择的图元


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

我想这会奏效:

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

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

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

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

布拉
布拉
bli
1.
ble
布鲁
0
这是在升华文本的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>.
(?s)(?:(!)+?0.+?
(?s)->全局搜索和多行
->发现事件
(?:…)->组但不捕获子匹配
(?!…)->消极前瞻
(?:(?!).)+? 
->找到一切
直到一个新的开始。
这是为了不选择两个或多个注释
一次过。
0.+? 
->然后查找“0”
加上一切,然后找到。
因此:

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

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

找到子模式

找到剩下的


找到结尾(主模式)

它不起作用,但我将它调整为:(?s)(?:(?!)+?0.+?这很有效,非常感谢!!嗯,我不确定崇高文本是否支持所有格量词。也许没有。