我正在从看起来像这样的文本文件中提取字符串:
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 ""*.",""
".*" "
和""*."
导致语法错误,因为您忘记了将_embedded的"
转义为`"
。或者,使用
'...'
(单引号文字字符串),它允许您按原样嵌入"
,通常更适合于正则表达式和替换操作数,因为对于PowerShell可以解释哪些部分(字符串扩展)没有任何混淆。但是,即使解决了转义问题,您的
-replace
操作也不起作用,因为.*"
贪婪地匹配,因此直到最后一个"
;这是一个非贪婪匹配的更正解决方案,并且省略了替换操作数(这使其默认为空字符串):PS> 'C:\...ps1:37: Url = "https://somewebsite.com"' -replace '^.*?"' -replace '"$'
https://somewebsite.com
^.*?"
非贪婪地替换所有内容,直到第一个"
为止。 "$
替换字符串末尾的"
。 但是,您可以使用单个
-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开始尚未实现-使用建议的
Select-String
开关允许-Raw
直接发出字符串-请参见https://github.com/PowerShell/PowerShell/issues/7713
关于regex - Powershell:从字符串中提取URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54910610/