Оператор PowerShell -match
только когда-либо находит (самое большее) одно совпадение, впоследствии отраженное в автоматической $Matches
переменной . [1]
Как Wiktor Stribiżew намекает на комментарий в вопросе, используя базовый класс .NET [regex]
с его статическим .Matches()
методом , непосредственно возвращающим все совпадений .
Однако, как написано ваше регулярное выражение, каждое совпадение будет содержать все 3 группы захвата (digita
, digitb
, digitc
), только с одной из они содержат захваченное значение, что затрудняет доступ к результатам.
Вместо этого используется следующий синтаксис (PSv4 +):
- универсально названная группа захвата для цифры (
?(<digit>...)
)
- группа имен с общим названием для буквы (
?(<letter>...)
)
- без чередования (
|
)
, чтобы каждое совпадение содержало 2 группы захвата, содержащие соответственно захваченную букву и цифру.
$s2 = 'a=3 c=5 b=4'
$allMatches = [regex]::Matches($s2, '(?<letter>[abc])=(?<digit>[0-9])')
$allMatches.ForEach({
'letter: {0} - digit: {1}' -f $_.Groups['letter'].value, $_.Groups['digit'].value
})
В PSv3- вы можете использовать оператор foreach
для перебора совпадений (foreach ($match in $allMatches) { ... }
).
Вышеуказанные выходы:
letter: a - digit: 3
letter: c - digit: 5
letter: b - digit: 4
Обратите внимание, что [regex]::Matches()
возвращает экземпляр [System.Text.RegularExpressions.MatchCollection]
, который является коллекцией [System.Text.RegularExpressions.Match]
экземпляров.
Альтернативой является использование Select-String
с переключателем -AllMatches
, который, однако, на медленнее - что может или может не иметь значения, в зависимости от варианта использования (PSv2 +):
$s2 = 'a=3 c=5 b=4'
$s2 | Select-String -AllMatches '(?<letter>[abc])=(?<digit>[0-9])' |
Select-Object -ExpandProperty Matches | ForEach-Object {
'letter: {0} - digit: {1}' -f $_.Groups['letter'].value, $_.Groups['digit'].value
}
Select-Object
выводит [Microsoft.PowerShell.Commands.MatchInfo]
экземпляров, чье свойство .Matches
содержит массив, опять же, [System.Text.RegularExpressions.Match]
экземпляров.
[1] $Matches
содержит экземпляр [hashtable]
, чья запись 0
содержит общее совпадение, а группы захвата начинаются с записи 1
, если она не указана; Именованные группы захвата могут быть доступны по их имени, например $Matches.digita
в примере из вопроса.