【问题标题】:Powershell: Pull URL out of StringPowershell:从字符串中提取 URL
【发布时间】:2019-02-27 16:53:03
【问题描述】:

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

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

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

【问题讨论】:

    标签: regex powershell select-string


    【解决方案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 不会直接输出匹配行,作为字符串,而是作为match-information objects;要获取匹配行,请访问.Line 属性[1]

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

    ".*" """*." 导致语法错误,因为您忘记转义 _embedded "`"

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

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

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

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

    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

    【讨论】:

    • 我很高兴听到它有帮助,@revgirl2012;我的荣幸。祝你好运;我希望你能学会享受 PowerShell;这可能需要一段时间,但这是值得的。
    猜你喜欢
    • 1970-01-01
    • 2021-12-03
    • 2021-10-04
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    相关资源
    最近更新 更多