我正在寻找正则表达式(对于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>
它在一个选择中选择的元素多于它应该的元素。
看起来很简单,但我无法在任何地方找到正确答案。
答案 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>.
所以:
首先找到开始(主模式)然后
找到一切,但不是一个新的开始
找到子模式
找到其余的
找到结束(主模式)