Powershell:从字符串中提取URL

时间:2019-02-27 16:53:03

标签: regex powershell select-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

但这并没有做任何事情。我认为它与正则表达式有关,但我不确定如何放置它。任何帮助表示赞赏。谢谢

1 个答案:

答案 0 :(得分:1)

我建议将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不会以 string 的形式直接输出匹配行 ,而是以match-information objects的形式输出;要获取匹配的行,请访问.Line属性 [1]

  

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

".*" """*."导致语法错误,因为您忘记了将嵌入" 转义为{{1} }。

或者,使用`"(单引号 literal 字符串),它允许您按原样嵌入'...',通常更适合于正则表达式和替换操作数,因为对于PowerShell可以解释哪些部分(字符串扩展)没有任何困惑。

即使解决了转义问题,您的"操作也不起作用,因为-replace匹配贪婪地,因此匹配的是 last < / em> .*";这是具有 non-greedy 匹配的更正解决方案,并且省略了替换操作数(这使其默认为空字符串):

"
  • 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 '^.*?"(.*?)"', '$1' https://somewebsite.com 指的是第一个捕获组($1)捕获的内容,即裸URL。有关更多信息,请参见this answer


[1]请注意,有一个呈绿色亮起的功能建议-从Windows PowerShell Core 6.2.0开始尚未实现-允许(...)使用建议的{{1}直接发出字符串}开关-参见https://github.com/PowerShell/PowerShell/issues/7713