使用 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
中国
印度
韩国
马来西亚
泰国
给定以下字符串:
'<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
中国
印度
韩国
马来西亚
泰国