Как отсортировать соответствие регулярному выражению в PowerShell по значению массива groups - PullRequest
1 голос
/ 29 мая 2019

У меня есть массив строк, и каждая строка содержит число, которое представляет номер спринта (scrum). Теперь я хочу отсортировать массив по номеру спринта с помощью регулярных выражений в Powershell.

Пример массива

  • a.sprint-100
  • a.sprint-99
  • a.sprint-49
  • a.sprint-98
# 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.". Или есть лучший способ получить желаемый результат сортировки?

Для упрощения я использовал здесь строковый массив. Но в реальном сценарии это массив, включающий пользовательские объекты с кучей данных. Этот массив должен быть отсортирован после моего канала регулярных выражений.

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 29 мая 2019

Вам нужно отсортировать по числовой части строк, сначала преобразованной в [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
0 голосов
/ 29 мая 2019
$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

Может быть немного сложнее, но это работает для строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...