PetSerAl , как и бесчисленное количество раз ранее, предоставил критический указатель в комментарии:
Возможно, что удивительно, экземпляр [System.Text.RegularExpressions.Match]
, возвращаемый статическим [regex]::Match()
метод (или его аналог экземпляра-метода) содержит 1 элемент в свойстве .Groups
, даже если операция сопоставления не не удалась [1] , так что, если экземпляр хранится в $match
, $match.Groups.Count
всегда , возвращается $true
.
Вместо используйте свойство .Success
, чтобы определить, найдено ли совпадение, как вы уже делаете в цикле while
:
if ($match.Success) {
while ($match.Success) {
"Match found: {0}" -f $match.Value
$match = $match.NextMatch()
}
} else {
"Not Found"
}
Обратите внимание, что я удалил Write-Host
звонки, потому что Write-Host
, как правило, неправильный инструмент для использования , если только намерение явно не записать только на дисплей , тем самым пропуская выходные потоки PowerShell и, таким образом, возможность отправкивывод в другие команды, захватить его в переменную или перенаправить в файл.
[1] [regex]::Match('a', 'b').Groups.Count
возвращает 1
, хотя матч явно не удался.