RegEx使用量词查找多个匹配项

时间:2015-10-10 06:23:26

标签: regex powershell

我有这个PowerShell代码:

$uri = "http://charts.spotify.com/api/tracks/most_streamed/au/daily/latest"
$ContentType = "application/json"
$postblog = (Invoke-WebRequest -Uri $uri).Content -match 'track_name\S:\S(.*?)",'
$matches[1]

当我运行这个时,我得到了这个结果:

FourFiveSeconds

问题是,我知道有更多的歌曲而不仅仅是这首歌。我知道我正在使用的比赛,文字字符串" track_name "存在不止一次。如何更改我的RegEx以使其匹配它可以找到的每个匹配?换句话说,预期输出将是多个匹配,允许我列出所有歌曲,例如$matches[1]$matches[2]$matches[3]$matches[4]等。

2 个答案:

答案 0 :(得分:4)

由于您使用的是Invoke-WebRequest,我假设您使用的是Powershell v4.0。因此,您可以对收到的数据使用ConvertFrom-Json并对其进行迭代,而不是使用正则表达式解决方案:

$uri = "http://charts.spotify.com/api/tracks/most_streamed/au/daily/latest"
$ContentType = "application/json"
$postblog = (Invoke-WebRequest -Uri $uri).Content | ConvertFrom-Json

现在,整个tracks数据在$postblog.tracks数组中可用。

迭代它们以获得track_url s:

Foreach( $track in $postblog.tracks ) {
    Write-Output $track.track_url
}

修改

显然,你可以简单地使用:

Write-Output $postblog.tracks.track_url

而不是Foreach代码块。感谢@PetSerAl:)

答案 1 :(得分:0)

感谢所有人,是的,你是对的,将它转换为JSON给了我更多的选择,它比使用RegEx更清晰。

我现在有这个脚本,这绝对应该可以解决问题。

$spotifytopsongs = @()
$uri = "http://charts.spotify.com/api/tracks/most_streamed/au/daily/latest"
$ContentType = "application/json"
$spotifyjson = (Invoke-WebRequest -Uri $uri).Content | ConvertFrom-Json
$spotifyjson.tracks | select -First 50 | % {$spotifytopsongs += @($_.artist_name + " - " + $_.track_name)}
cls;$spotifytopsongs