我有一个字符串数组,每个字符串都包含一个代表sprint(临时)数字的数字。现在,我想使用Powershell中的正则表达式按冲刺数对数组进行排序。
数组示例
# define the array
$a = @("a.sprint-100","a.sprint-99","a.sprint-49","a.sprint-98")
# escape hard defined string in regex
$escapedString = [regex]::escape(".sprint-")
# create regex which matches <AnyCharacter>.sprint-<SprintNumber>
[regex]$regex = "(.+)$escapedString([0-9]{2,3})"
# process the regex on all strings and print out the sprint number
$a | %{[System.Text.RegularExpressions.Regex]::Match($_, $regex)} | %{$_.Groups[2].value}
# output: 100 99 49 98
# but my sort logic doesn't work
$a | %{[System.Text.RegularExpressions.Regex]::Match($_, $regex)} | Sort-Object -Property {$_.Groups[2].value} -Descending | %{$_.Groups[2].value}
# output: 99 98 49 100
我正在对字符串进行排序。因此,这可能是主要问题。 有谁知道将匹配值解析为int吗?
如果我尝试这样做,那么我会得到'value' is a ReadOnly property."
。
还是有更好的方法来获得所需的排序结果?
为简化起见,我在这里使用了一个字符串数组。但是在实际情况下,它是一个包含自定义对象和一堆数据的数组。此数组应在我的正则表达式管道之后排序。
谢谢!
答案 0 :(得分:2)
您需要对字符串的数字部分进行排序,首先将其转换为[int]
,因为否则,排序将仍然是字母数字:
# define the array
$a = "a.sprint-100","a.sprint-99","a.sprint-49","a.sprint-98"
# sort on the numeric part of the strings, converted to [int]
$a | Sort-Object {[int]($_ -split '-')[-1]}
结果:
a.sprint-49 a.sprint-98 a.sprint-99 a.sprint-100
答案 1 :(得分:0)
$a | %{
[System.Text.RegularExpressions.Regex]::Match($_, $regex)} | %{
[PSCustomObject]@{
sprint=[convert]::ToInt32($_.Groups[2].value,10)
name=$_.Groups[0].value
}
} | Sort-Object -Property {$_.sprint} | Select -ExpandProperty name
# Output a.sprint-49 a.sprint-98 a.sprint-99 a.sprint-100
也许有点复杂,但是它适用于字符串。