Powershell:从字符串中拉出 URL

Powershell: Pull URL out of String

我正在从文本文件中提取字符串,如下所示:

C:\Users\users\Documents\Firefox\tools\Install.ps1:37:    Url = "https://somewebsite.com"

我需要了解如何删除 URL 以外的所有内容,因此它应该如下所示:

https://www.somewebsite.com

这是我尝试过的:

$Urlselect = Select-String -Path "$zipPath\tools\chocolateyInstall.ps1"  -Pattern "url","Url"-List # Selects URL download path
$Urlselect = $Urlselect -replace ".*" ","" -replace ""*.","" # remove everything but the download link

但这并没有起到任何作用。我认为它与正则表达式有关,但我不确定如何表达。任何帮助表示赞赏。谢谢

我建议将 switch statement-Regex-File 选项一起使用:

$url = switch -regex -file "$zipPath\tools\chocolateyInstall.ps1" { 
  ' Url = "(.*?)"' { $Matches[1]; break } 
}
  • -file 使 switch 遍历指定文件的所有行。
  • -regex 将分支条件解释为 regular expressions,并且自动 $Matches 变量可用于关联的脚本块 ({ ... }) 以访问结果匹配项,特别是正则表达式 ((...)) 中第一个(也是唯一一个)捕获组捕获的内容 - 感兴趣的 URL。
  • 一旦找到第一个匹配项,
  • break 就会停止处理。 (要继续匹配,请使用 continue)。

如果你想使用 Select-String:

$url = Select-String -List ' Url = "(.*?)"' "$zipPath\tools\chocolateyInstall.ps1" |
  ForEach-Object { $_.Matches.Groups[1].Value }

请注意,switch 解决方案的性能会好得多。


至于你试过的

Select-String -Path "$zipPath\tools\chocolateyInstall.ps1" -Pattern "url","Url"

Select-String 默认情况下 不区分大小写 ,因此无需指定同一字符串的大小写变体。 (相反,您必须使用 -CaseSensitive 开关强制大小写-敏感 匹配)。

另请注意,Select-String 不会将匹配行 直接 输出为 字符串 ,而是作为 match-information objects;要获取匹配行,请访问 .Line 属性[1].

$Urlselect -replace ".*" ","" -replace ""*.",""

".*" """*." 导致 语法错误 ,因为你忘记了 escape _embedded "`"

或者,使用 '...'(单引号 文字 字符串),它允许您按原样嵌入 ",通常更适合正则表达式和替换操作数,因为没有混淆 PowerShell 可能预先解释的部分(字符串扩展)。

即使解决了转义问题,您的 -replace 操作也不会起作用,因为 .*" 匹配 greedily 因此直到最后 ";这是一个更正的解决方案,具有 非贪婪 匹配,并省略了替换操作数(这使其默认为空字符串):

PS> 'C:\...ps1:37: Url = "https://somewebsite.com"' -replace '^.*?"' -replace '"$'
https://somewebsite.com
  • ^.*?" 非贪婪地替换所有直到 first ".
  • "$ 替换字符串末尾的 "

但是,您可以使用 单个 -replace 操作来完成此操作,使用与顶部 switch 解决方案相同的正则表达式:

PS> 'C:\...ps1:37: Url = "https://somewebsite.com"' -replace '^.*?"(.*?)"', ''
https://somewebsite.com
替换操作数中的

</code>指的是第一个捕获组(<code>(...))捕获的内容,即裸URL;有关详细信息,请参阅


[1] 请注意,有一个绿灯功能建议 - Windows PowerShell Core 6.2.0 尚未实施 - 允许 Select-String 直接发出字符串,使用建议的 -Raw 开关 - 请参阅 https://github.com/PowerShell/PowerShell/issues/7713