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

Extract multiple occurrences of a substring using 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 提取其中列出的所有国家/地区。换句话说我想 return @(China,India,Korea,Malaysia,Thailand).

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

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

哪个 returns:

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

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

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

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

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

毫升

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

中的 Matches 方法
$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,您最好使用一些 HTML 解析器,正如 向您建议的那样。

正则表达式从来都不是处理 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
$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

中国

印度

韩国

马来西亚

泰国