gpt4 book ai didi

regex - Powershell中的Regex无法检查换行符

转载 作者:行者123 更新时间:2023-12-02 23:37:09 24 4
gpt4 key购买 nike

我正在尝试获取第一批发行说明...
(请参阅代码中的示例内容)

只要我使用简单的方法,它就会起作用,但只有在我尝试
跨多行搜索(\n)。我使用(Get-Content $changelog | Out-String)是因为它会返回1个字符串,而不是每行中的一个数组。

$changelog = 'C:\Source\VSTS\AcmeLab\AcmeLab Core\changelog.md'
$regex = '([Vv][0-9]+\.[0-9]+\.[0-9]+\n)(^-.*$\n)+'

(Get-Content $changelog | Out-String) | Select-String -Pattern $regex -AllMatches

<#
SAMPLE:
------
v1.0.23
- Adds an IContainer API.
- Bugfixes.

v1.0.22
- Hotfix: Language operators.

v1.0.21
- Support duplicate query parameters.

v1.0.20
- Splitting up the ICommand interface.
- Fixing the referrer header empty field value.

#>

我需要的结果是:
v1.0.23
- Adds an IContainer API.
- Bugfixes.

更新:

使用 options ..
$changelog = 'C:\Source\VSTS\AcmeLab\AcmeLab Core\changelog.md'
$regex = '(?smi)([Vv][0-9]+\.[0-9]+\.[0-9]+\n)(^-.*$\n)+'

Get-Content -Path $changelog -Raw | Select-String -Pattern $regex -AllMatches

我也一无所获..(无论我使用 \n还是 \r\n)

最佳答案

  • 除非您坚持使用PowerShell v2,否则使用Get-Content -Raw将整个文件作为单个字符串读取将更简单有效。此外,Out-String在字符串中添加了额外的换行符。
  • 因为您只在寻找第一个匹配项,所以可以使用-match运算符-无需Select-String-AllMatches开关。
  • 注意:虽然您可以不使用Select-String,但是使用-match运算符会更有效,因为您已经将整个文件读入内存。
  • Regex匹配默认情况下在PowerShell中始终不区分大小写,这与PowerShell的整体不区分大小写一致。

  • 因此,以下代码将返回第一个块(如果有):
    if ((Get-Content -Raw $changelog) -match '(?m)^v\d+\.\d+\.\d+.*(\r?\n-\s?.*)+') { 
    # Match found - output it.
    $Matches[0]
    }

    * (?m)启用内联正则表达式选项 m(多行),这会导致 anchor ^$匹配各个行的开头和结尾,而不是整个字符串的开头和结尾。
    * \r?\n匹配CRLF和仅LF换行符。
    *您可以通过使 (...)子表达式不捕获来提高正则表达式的效率,因为您对捕获的内容不感兴趣: (?:...)

    请注意, -match本身返回一个 bool(boolean) 值(带有标量LHS),但是有关匹配项的信息记录在自动 $Matches哈希表变量中,其 0条目包含整体匹配项。

    至于 您尝试了什么:
    '([Vv][0-9]+\.[0-9]+\.[0-9]+\n)(^-.*$\n)+'

    不起作用,因为默认情况下 $仅在输入字符串的末尾,最后一行的末尾匹配(尽管可能在最后一个换行符之前)。
    为了使 $与每行的末尾匹配,您必须打开多行regex选项(这是您第二次尝试所做的)。
    结果,没有任何匹配。
    '(?smi)([Vv][0-9]+\.[0-9]+\.[0-9]+\n)(^-.*$\n)+'

    不能按预期工作,因为通过使用选项 s(单行),您也使 .与换行符匹配,因此贪婪的子表达式(如 .*)将跨行匹配字符串的其余部分。
    结果,从第一个块开始的所有内容都匹配。

    关于regex - Powershell中的Regex无法检查换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52633995/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com