Есть ли более короткий способ вытащить группы из регулярного выражения Powershell? - PullRequest
18 голосов
/ 18 июня 2009

В PowerShell я снова и снова делаю подобные вещи для матчей:

some-command | select-string '^(//[^#]*)' |
     %{some-other-command $_.matches[0].groups[1].value}

Так в основном - запустить команду, которая генерирует строки текста, и для каждой строки я хочу выполнить команду для захвата регулярных выражений внутри строки (если она совпадает). Кажется, действительно просто. Вышеописанное работает, но есть ли более короткий способ вытащить эти группы захвата регулярных выражений? У Perl был 1 доллар и так далее, если я правильно помню. Шикарный должен иметь что-то подобное, верно? Я видел ссылки на «$ match» на SO, но не могу понять, для чего это делается.

Кстати, я новичок в PowerShell, только начал изучать.

Ответы [ 3 ]

14 голосов
/ 18 июня 2009

Вы можете использовать оператор -match, чтобы переформулировать вашу команду как:

some-command | Foreach-Object { if($_ -match '^(//[^#]*)') { some-other-command $($matches[1])}}
8 голосов
/ 07 марта 2012

Названная замена

'foo bar' -replace '(?<First>foo).+', '${First}'

Возвращает: foo

Безымянная замена

 'foo bar' -replace '(foo).+(ar)', '$2 z$2 $1'

Возвращает: ar zar foo

4 голосов
/ 18 июня 2009

Вы можете попробовать это:

Get-Content foo.txt | foreach { some-othercommand [regex]::match($_,'^(//[^#]*)').value } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...