使用Powershell提取多次出现的子字符串

时间:2015-01-14 07:51:10

标签: regex powershell

给出以下字符串:

'<p><a href="china">China</a><br><a href="india">India</a><br><a
href="korea">Korea</a><br><a href="malaysia">Malaysia</a><br><a
href="thailand">Thailand</a></p>'

我想使用Powershell来提取其中列出的所有国家/地区。换句话说,我想回归@(中国,印度,韩国,马来西亚,泰国)。

尝试使用正则表达式但无法找到正确的模式,例如:

'<p><a href="china">China</a><br><a href="india">India</a><br><a href="korea">Korea</a><br><a href="malaysia">Malaysia</a><br><a href="thailand">Thailand</a></p>'  -match '(<a href="[A-Z a-z]*">[A-Z a-z]*</a>)+'
$matches

返回:

Name                           Value                                                                                                                                                                                            
----                           -----                                                                                                                                                                                            
1                              <a href="china">China</a>                                                                                                                                                                        
0                              <a href="china">China</a>

有什么建议吗?正则表达式是正确的方法吗?

P.S。请注意,该代码段格式不正确,因此我无法简单地将其转换为XML。

4 个答案:

答案 0 :(得分:2)

$Matches自动变量包含有关上次-match操作的匹配捕获组的信息,而不包含有关匹配的信息。如果您想获得多个模式匹配,那么您必须使用Matches类中的[Regex]方法:

$InputString='<p><a href="china">China</a><br><a href="india">India</a><br><a href="korea">Korea</a><br><a href="malaysia">Malaysia</a><br><a href="thailand">Thailand</a></p>'
$Pattern='<a href="[A-Z a-z]*">([A-Z a-z]*)</a>'
$Countries=[Regex]::Matches($InputString,$Pattern)|ForEach-Object {$_.Groups[1].Value}
$Countries

虽然对于解析HTML,最好使用other answer建议的一些HTML解析器。

答案 1 :(得分:0)

以下正则表达式应该可以解决这个问题:

(?<=><a\shref="\w+">)\w+

ML

答案 2 :(得分:0)

正则表达式永远不是处理HTML的好方法(尽管它们通常很诱人)。您可以解析HTML并提取所需的数据,而无需使用任何正则表达式:

PS C:\> $d = '<p><a href="china">China</a><br><a href="india">India</a><br><a
href="korea">Korea</a><br><a href="malaysia">Malaysia</a><br><a
href="thailand">Thailand</a></p>'


PS C:\> $html = New-Object -ComObject "HTMLFile"

PS C:\> $html.IHTMLDocument2_write($d)

PS C:\> $html.getElementsByTagName('A') | select -expandProperty innerText
China
India
Korea
Malaysia
Thailand

答案 3 :(得分:0)

$InputString='<p><a href="china">China</a><br><a href="india">India</a><br><a href="korea">Korea</a><br><a href="malaysia">Malaysia</a><br><a href="thailand">Thailand</a></p>'
$Pattern='(?<=>)\w+?(?=<)'

([Regex]::Matches($InputString,$Pattern)).Value

中国

印度

韩国

马来西亚