Я должен знать, сколько замен сделано Powershell при использовании любого -replace
оператор или Replace()
метод. Или, если это не возможно, если это сделало какие-либо замены вообще.
Например, в Perl, потому что операция замены возвращает количество замен, сделанных, и нуль является ложью, в то время как ненулевой верно в булевом контексте, можно записать:
$greeting = "Hello, Earthlings";
if ($greeting ~= s/Earthlings/Martians/) { print "Mars greeting ready." }
Однако с Powershell оператор и метод возвращают новую строку. Кажется, что оператор предоставляет некоторую дополнительную информацию, если Вы знаете, как попросить его (например, полученные группы хранятся в новой переменной, которую это создает в текущей области), но я не могу узнать, как получить значение количества или успеха.
Я мог просто выдержать сравнение прежде и после значений, но это кажется совершенно неэффективным.
Вы правы, я не думаю, что вы можете выжать что-нибудь лишнее из -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