regex - Powershell:从字符串中提取URL

标签 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

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

最佳答案

我建议将 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/

    相关文章:

    c# - 如何在Azure云服务上使用第3方DLL

    powershell - 使用 PowerShell 进行 Ruby 静默安装

    powershell - 使用 “findstr”时如何获取命令的完整输出?

    regex - Select-String:仅当字符串前面没有特定字符时才匹配字符串

    powershell - Select-String 输出给出整个对象并且不响应过滤器

    java - 在特定模式之前拆分所有内容

    javascript - 字符串太长时正则表达式匹配不起作用?

    PHP 正则表达式无法正常工作

    regex - 如何 grep 向量并返回单个 TRUE 或 FALSE?

    python - 在Windows中使用python获取重启历史记录