gpt4 book ai didi

regex - 在Powershell中按正则表达式中的命名捕获组排序

转载 作者:行者123 更新时间:2023-12-02 23:34:11 25 4
gpt4 key购买 nike

我有一个正则表达式定义如下:

$regexpo = "^Amma\s(?'version'(\d+\.){3}\d)\.zip$"

上面的表达式的标签带有组-(\ d +。){3} \ d)

我正在如下使用它:
$Library =  $wholeContent | 
Where-Object { $_.Name -match $regexpo } |
Sort-Object Name -Descending

但是我想按定义的正则表达式中的带标签的组对它进行排序,该正则表达式代表版本号。

最佳答案

Sort-Object 与计算所得的属性(对每个输入对象进行评估的脚本块({ ... })一起反射(reflect)在$_中)一起使用,如下所示:

# Sample input
$wholeContent =
[pscustomobject] @{ Name = 'Amma 10.0.0.1.zip'; Type = '...' },
[pscustomobject] @{ Name = 'Not a match' ; Type = '...' },
[pscustomobject] @{ Name = 'Amma 1.0.0.2.zip' ; Type = '...' },
[pscustomobject] @{ Name = 'Amma 2.1.2.3.zip' ; Type = '...' }

# Define the regex that matches the full name
# and captures the embedded version number in named capture group 'version'.
# Better to use '...' (single quotes) to define regexes, to prevent
# confusion with string expansion inside "..."
# Note the alternate syntax `<version>` instead of `'version'`.
$regex = '^Amma\s(?<version>(\d+\.){3}\d+)\.zip$'

# Filter by the line of interest, then sort by the extracted version number.
# Automatic variable $Matches is a hashtable that contains the results of
# the regex match, with entry 'version' containing the capture group's value.
# Casting to [version] ensures that version-appropriate sorting is used.
$wholeContent |
Where-Object { $_.Name -match $regex } |
Sort-Object { [version] ($_.Name -replace $regex, '${version}') }

请注意,这里需要两次匹配[1]:一次是过滤感兴趣的行,另一次是通过 -replace operator提取嵌入的版本文本。

注意:此处可以将 -replace与原始正则表达式一起使用,因为手头的正则表达式旨在匹配整个输入字符串,这允许仅使用命名捕获组的值( ${version})替换整个字符串,从而仅产生后者。更冗长的选择是使用另一个 -match操作通过 $Matches获取捕获组值: $null = $_.Name -match $regex; $Matches['version']
上面的代码产生了以下内容,表明仅提取了感兴趣的行,并按版本号正确对其进行了排序:

Name              Type
---- ----
Amma 1.0.0.2.zip ...
Amma 2.1.2.3.zip ...
Amma 10.0.0.1.zip ...

[1]虽然由 $Matches操作填充的 automatic -match variable原则上可以在后续管道段的脚本块中使用,从而允许访问匹配操作的结果,但由于 Sort-Object必需要聚合cmdlet,因此在此处不能使用它。也就是说,它必须首先收集所有输入才能执行排序,这时在计算属性中使用 $Matches仅包含最后一个输入对象的匹配项。

关于regex - 在Powershell中按正则表达式中的命名捕获组排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59804926/

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