2014-10-20 60 views
0

我有着相似的结构化的HTML文件的目录正则表达式(给出两个例子):抓取内容与在PowerShell中

文件的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剥离:

对于文件1.HTML:bar

对于文件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

在这里阅读一些建议:http://stackoverflow.com/a/11656434 – 2014-10-20 13:47:03

回答

2

默认情况下,quantifers是greedy。他们会尽可能地匹配,仍然允许正则表达式的其余部分匹配。使用*?表示“零或多个 - 优选尽可能少”的非贪婪匹配。

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