【问题标题】:PowerShell Select-String from file with Regex使用正则表达式从文件中选择字符串
【发布时间】:2025-12-23 17:40:09
【问题描述】:

我正在尝试从 .sln(Visual Studio 解决方案文件)中获取一串文本,以显示解决方案中包含哪些项目文件。

示例文本行是

Project("{xxxx-xxxxx-xxxx-xxxx-xx}") = "partofname.Genesis.Printing", "Production\partofname.Genesis.Printing\partofname.Genesis.Printing.csproj", "{xxx- xxx-xxx-xxx-xxxx}” 结束项目

我感兴趣的字符串部分是\"之间的最后一部分。

\partofname.Genesis.Printing.csproj"

我使用的正则表达式是:

$r = [regex] "^[\\]{1}([A-Za-z.]*)[\""]{1}$"

我正在读取文件内容:

$sln = gci .\Product\solutionName.sln

我不知道在我的字符串选择语句中放什么。

我是 PowerShell 的新手,希望能提供任何帮助...

我之前确实有一个非常非常长期的方法,但我已经失去了工作......本质上它是为文件中的每一行做这个:

Select-String $sln -pattern 'proj"' | ? {$_.split()}

但是正则表达式会容易得多(我希望如此)。

【问题讨论】:

    标签: regex string powershell substring


    【解决方案1】:

    以下内容获取"proj" 之间的所有内容:

    Select-String -Path $PathToSolutionFile ', "([^\\]*?\\)*([^\.]*\..*proj)"' -AllMatches | Foreach-Object {$_.Matches} | 
           Foreach-Object {$_.Groups[2].Value}
    

    第一组获取项目文件所在的文件夹。第二组获取只是您请求的(项目文件名)。 AllMatches 返回每​​场比赛,而不仅仅是第一场比赛。之后,只需遍历匹配对象上的每个匹配集合并获取匹配中第二组的值。

    【讨论】:

    • 我得到了partofname.Genesis.Printing\partofname.Genesis.Printing.csproj 而不是Production\partofname.Genesis.Printing\partofname.Genesis.Printing.csproj,我期望它是“和proj”之间的部分。你能解释一下角括号的作用吗,它们是量词吗? ^ 表示 not? 是零或一。. 是任何字符,* 是零或更多。
    • @Timo 第二组没有得到引号中的所有内容。它只获取项目文件名。但实际上表达式中存在错误。第二个? 应该是+*。各种在线资源可以比我在评论中更好地解释正则表达式组件。
    【解决方案2】:

    您的脚本运行良好。要制作一个衬里,请在 Select String 上添加 -Path:

    Select-String -path $pathtoSolutionFile ', "([^\\]*?\\)?([^\.]*\..*proj)"' -
    AllMatches | Foreach-Object {$_.Matches} | Foreach-Object {$_.Groups[2].Value}
    

    要从这里构建,您可以使用 Groups[0]

    (((Select-String -path $pathtoSoultionFile ', "([^\\]*?\\)?([^\.]*\..*proj)"' -AllMatches | Foreach-Object {$_.Matches} | 
           Foreach-Object {$_.Groups[0].Value})-replace ', "','.\').trim('"'))
    

    【讨论】:

      【解决方案3】:

      对我来说,这种模式是最好的: [^"]+\.csproj

      【讨论】: