Powershell +正则表达式 - 如何获得多个匹配?

时间:2013-08-23 10:20:46

标签: regex powershell expression

我已经试图解决下面的问题,但我会很感激每一条评论或建议。

先决条件

  1. HTML文字

    <div style="font-size:8pt; font-family: Calibri, sans-serif;">Some text here</div>

  2. 2)Powershell v.3

    任务

    解析给定文本并仅选择标记

    方法

    $text_to_parse = '<div style="font-size:8pt; font-family: Calibri, sans-serif;">Some    text here</div>'
    if($text_to_parse -match '</?div[^<>]*>'){$Matches | fl}
    Name  : 0
    Value : <div style="font-size:8pt; font-family: Calibri, sans-serif;">
    

    问题

    1)正如您所看到的,尽管/?量词,但它并未显示第二场比赛 2)我明白,必须有&#34; Global&#34;锚,但即使在MSDN中也找不到它:http://msdn.microsoft.com/library/az24scfc.aspx 3)即使我在开始时为一个或多个角色添加模式,\G锚也不起作用:

    if($text_to_parse -match '\G<.*?/?div[^<>]*>'){$Matches | fl}
    
    Name  : 0
    Value : <div style="font-size:8pt; font-family: Calibri, sans-serif;">`
    

    问题

    1)我做错了什么?我花了4个多小时试图找出它没有任何成功。 2)有没有&#34; Global&#34;在Powershell的RegEx实现中锚定? 3)最后,如何仅将HTML标记与正则表达式匹配?我可以这样做:

    ($text_to_parse -replace '\G<.*?/?div[^<>]*>',"").TrimEnd("</div>")
    

    得到这个:

    Some text here
    

    但是我想用正则表达式来做这件事。

    亲切的问候, 尤里

2 个答案:

答案 0 :(得分:1)

-match运算符仅返回第一个匹配项。要获得多个匹配项,请使用以下语法:

$text_to_parse = '<div style="font-size:8pt; font-family: Calibri, sans-serif;">Some    text here</div>' ;
$matches = ([regex]'</?div[^<>]*>').Matches($text_to_parse) ;
$matches[1].Value ; # returns second your occurrence, "</div>"

此方法将返回我们都知道和喜爱的匹配数组,您可以按照自己的方式处理它们。

答案 1 :(得分:0)

如果我理解正确,您希望匹配标签内的文字。然后使用这样的东西:

$text_to_parse -replace '<div[^>]+>(.*?)</div>', '$1'

它只返回文本。

Some text here


除了获得多个匹配提醒我这个任务:

  

给定测试“ab cd ef ax 0 a0”选择所有以“a”开头的字符串

然后

$s = "ab cd ef ax 0 a0"
$s -match '\ba\w'

是用途,但你可以这样做:

$s | Select-String '\ba\w' -AllMatches | 
   % { $_.Matches } |                        # select matches
   % { $_.Value }                            # selectt values from matches

在V3中它可能更简单,这适用于V2。