Powershell, сколько замен Вы делали?

Я должен знать, сколько замен сделано Powershell при использовании любого -replace оператор или Replace() метод. Или, если это не возможно, если это сделало какие-либо замены вообще.

Например, в Perl, потому что операция замены возвращает количество замен, сделанных, и нуль является ложью, в то время как ненулевой верно в булевом контексте, можно записать:

$greeting = "Hello, Earthlings";
if ($greeting ~= s/Earthlings/Martians/) { print "Mars greeting ready." }

Однако с Powershell оператор и метод возвращают новую строку. Кажется, что оператор предоставляет некоторую дополнительную информацию, если Вы знаете, как попросить его (например, полученные группы хранятся в новой переменной, которую это создает в текущей области), но я не могу узнать, как получить значение количества или успеха.

Я мог просто выдержать сравнение прежде и после значений, но это кажется совершенно неэффективным.

7
задан Justin R. 1 March 2010 в 18:25
поделиться

1 ответ

Вы правы, я не думаю, что вы можете выжать что-нибудь лишнее из -replace. Однако вы можете узнать количество совпадений с помощью Regex.Matches () . Например,

> $greeting = "Hello, Earthlings"
> $needle = "l"
> $([regex]::matches($greeting, $needle)).Length # cast explicitly to an array
3

Затем вы можете использовать оператор -replace, который использует тот же механизм сопоставления.


Если присмотреться немного глубже, обнаружится перегрузка Replace, которая принимает делегат MatchEvaluator , который вызывается каждый раз, когда выполняется сопоставление. Итак, если мы используем это как аккумулятор, он может подсчитать количество замен за один раз.

> $count = 0
> $matchEvaluator = [System.Text.RegularExpressions.MatchEvaluator]{$count ++}
> [regex]::Replace("Hello, Earthlings","l",$matchEvaluator)
> $count
Heo, Earthings
3
8
ответ дан 7 December 2019 в 05:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: