如何制作一个非贪婪的正则表达式?

时间:2015-06-03 11:30:37

标签: regex

我有这样的事情: ...

<div class="viewport viewport_h" style = "overflow: hidden;" >
    <div id="THIS" class="overview overview_h">
        <ul>
                 <li>some txt to be captured</li>
                 <li>some txt to be captured</li>
                 <li>some txt to be captured</li>
        </ul>
        <div>
            " some text to be captured"
        </div>
    </div>
</div>
"some text not to be captured"
</div>
<div class="scrollbar_h">
<div class="track_h"></div>

...

我希望使用div捕获id=THIS内的所有内容。我正在使用像:

这样的东西
@<div class="viewport viewport_h" style = "overflow: hidden;" >\s*<div class="overview overview_h">\s*(?:<ul>)?([\s\d\w<>\/()="-:;‘’!,:]+)(?:</div>)+?@

最后一个(?:</div>)+?是为了让它变得非贪婪而且#34;&lt; / div&gt;&#34;但是</div>后面的所有其他人都没有工作和捕获。 :(

1 个答案:

答案 0 :(得分:1)

正如评论中所述regex不是解析(?:X|H)TML文档的正确方法。

让我们考虑你的例子直接使用正则表达式:

<div[^>]*id="THIS"[^>]*>(.*?)</div>

DEMO

这将匹配以下文字:

    <ul>
             <li>some txt to be captured</li>
             <li>some txt to be captured</li>
             <li>some txt to be captured</li>
    </ul>
    <div>
        " some text to be captured"
    </div>

您可以看到它不是正确的结果,因为您需要另一个</div>因此您需要计算开放的div以便能够检测到结束div s  它全部基于您使用的语言。

现在,在这种情况下,如果你想创建一个非贪婪的结束潜水,你需要在dot之前放置一个+,如下所示:

<div[^>]*id="THIS"[^>]*>(.*?)(</div>).+?

DEMO

现在它将匹配另一个</div>,但仍然很难让正则表达式检测到真实的结果(对于另一种情况来说更复杂)。这就是解析{{1}的正确方法的原因使用(?:X|H)TML