У меня есть массив строк, и каждая строка включает число, которое представляет номер спринта (схватки). Теперь я хочу отсортировать массив по номеру спринта, используя регулярные выражения в 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."
.
Или есть лучший способ получить желаемый результат сортировки?
Для упрощения я использовал здесь массив строк. Но в реальном сценарии это массив, включающий пользовательские объекты с кучей данных. Этот массив должен быть отсортирован после моего регулярного выражения.
Заранее спасибо!
Вам нужно сначала отсортировать числовую часть строк, преобразованную в [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
Мне нужно использовать регулярное выражение для фильтрации недопустимых соглашений об именах. Я объединил это с вашим ответом: $a | %{[System.Text.RegularExpressions.Regex]::Match($_, $regex)} | ?{$_.Успех} | Sort-Object {[int]($_.Groups[2] -split '-')[-1]} | %{$_.Группы[0].значение}
@o_boo Отличный материал! В качестве примера вы показали только небольшой массив строк, поэтому у меня не было возможности увидеть, что еще вам нужно сделать с регулярным выражением и группировкой элементов. Рад, что мой ответ помог разобраться.
$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
Может быть, немного сложно, но это работает для строки.
Это похоже на облегченное решение. Я попробую это для своего варианта использования и отмечу его как ответ, если он сработает. Спасибо.