PowerShell中如何按正则表达式的命名捕获组排序
按正则捕获组的版本号排序解决方案
没问题,要实现按正则里捕获的version组排序其实很简单,而且咱们得用版本号专用的排序逻辑,避免字符串排序带来的问题(比如字符串排序时1.10.0.0会排在1.2.0.0前面,这显然不符合版本号的排序预期)。
简洁版实现
直接在Sort-Object里用脚本块提取并转换版本号即可,因为Where-Object匹配成功后,自动变量$matches会保留当前对象的捕获组内容:
$regexpo = "^Amma\s(?'version'(\d+\.){3}\d)\.zip$" $Library = $wholeContent | Where-Object { $_.Name -match $regexpo } | Sort-Object { [version]$matches['version'] } -Descending
更健壮的版本(处理异常情况)
如果担心有部分文件名匹配正则但提取版本失败的情况,可以加个容错判断,把异常项放到末尾:
$Library = $wholeContent | Where-Object { $_.Name -match $regexpo } | Sort-Object { if ($matches['version']) { [version]$matches['version'] } else { [version]'0.0.0.0' # 匹配失败的项默认设为最低版本 } } -Descending
带临时属性的清晰版(可选)
如果想更直观地看到版本号,也可以先给对象添加一个临时的版本属性,排序后再去掉:
$Library = $wholeContent | Where-Object { $_.Name -match $regexpo } | # 添加ParsedVersion属性,转换为version类型 Select-Object *, @{Name='ParsedVersion'; Expression={ [version]$matches['version'] }} | Sort-Object ParsedVersion -Descending | # 移除临时属性,回到原来的对象结构 Select-Object * -ExcludeProperty ParsedVersion
原理说明
PowerShell的[version]类型(对应.NET的Version类)会自动识别x.x.x.x格式的版本号,并按照主版本→次版本→构建号→修订号的顺序进行正确排序,完美解决字符串排序的缺陷。
内容的提问来源于stack exchange,提问作者sajis997
相关产品推荐
相关产品推荐

