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

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

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

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

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

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

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
1 046
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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

Это похоже на облегченное решение. Я попробую это для своего варианта использования и отмечу его как ответ, если он сработает. Спасибо.

Boologne 29.05.2019 14:25

Мне нужно использовать регулярное выражение для фильтрации недопустимых соглашений об именах. Я объединил это с вашим ответом: $a | %{[System.Text.RegularExpressions.Regex]::Match($_, $regex)} ​​| ?{$_.Успех} | Sort-Object {[int]($_.Groups[2] -split '-')[-1]} | %{$_.Группы[0].значение}

Boologne 29.05.2019 14:50

@o_boo Отличный материал! В качестве примера вы показали только небольшой массив строк, поэтому у меня не было возможности увидеть, что еще вам нужно сделать с регулярным выражением и группировкой элементов. Рад, что мой ответ помог разобраться.

Theo 29.05.2019 15:53
$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

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

Другие вопросы по теме