2

我已经打破了我的头试图解决下面的问题,我将不胜感激每条评论或建议。

先决条件

  1. HTML 文本

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

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)我明白,必须有“全球”锚,但即使在 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)Powershell中RegEx实现中是否有任何“全局”锚?3) 最后,如何只用正则表达式匹配两个 HTML 标签?我可以做这样的事情:

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

得到这个:

Some text here

但我想用正则表达式来做到这一点。

亲切的问候,尤里

4

2 回答 2

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>"

此方法将返回我们都知道和喜爱的匹配数组,您可以以任何您希望的方式处理它们。

于 2014-06-12T17:34:52.360 回答
1

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

$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 的。

于 2013-08-23T10:29:38.327 回答