在Powershell中使用正则表达式获取div的内容

时间:2014-10-20 13:30:19

标签: regex powershell

我有一个类似结构化HTML文件的目录(给出两个例子):

文件-1.HTML

<html>
    <body>
        <div class="foo">foo</div>
        <div class="bar"><div><p>bar</p></div></div>
        <div class="baz">baz</div>
    </body>
</html>

文件-2.HTML

<html>
    <body>
        <div class="foo">foo</div>
        <div class="bar"><div><p>apple<br>banana</p></div></div>
        <div class="baz">baz</div>
    </body>
</html>

我正在尝试创建一个Powershell脚本来返回bar div的内容,从所有html中删除:

For File-1.html:bar

For File-2.html:apple banana

我现在有:

$directory = "C:\Users\Public\Documents\Sandbox\HTML"

foreach ($file in Get-ChildItem($directory))
{
    $content = Get-Content $file.fullname

    $test = [regex]::matches($content, '(?i)<div class="bar">(.*)</div>')

    echo $test[0]
}

但是返回<div class="bar"><div><p>bar</p></div></div><div class="baz">baz</div>。换句话说,正则表达式在最后</div>之前不会停止。我怎样才能让抓住<div class="bar"> div中的内容?

1 个答案:

答案 0 :(得分:2)

默认情况下,量化为greedy。他们将尝试尽可能匹配仍然允许正则表达式的其余部分匹配。使用*?表示非贪婪匹配,表示“零或更多 - 最好尽可能少”。

(?si)<div class="bar">(.*?)</div>