Powershell: оператор совпадения возвращает true, но $match равен нулю
Я работаю с регулярным выражением, чтобы соответствовать содержимому файла:
> (get-content $_) -match $somePattern
the line of text that matches the pattern
это возвращает true, совпадение, однако моя переменная $match остается нулевой.
> $matches -eq $null
True
Разве в $match не должно быть групп совпадений?
2 ответа
Строго говоря string -match ...
а также collection -match ...
два разных оператора. Первый получает логическое значение и заполняет $matches
, Второй получает каждый элемент коллекции, который соответствует шаблону и, по-видимому, не заполняет $matches
,
Ваш пример должен работать так, как вы ожидаете, если файл содержит одну строку (первый оператор работает). Если файл содержит 2+ строки, то используется второй оператор и $matches
не установлен.
То же самое верно и для других булевых операторов, применяемых к коллекции. То есть collection -op ...
возвращает предметы, где item -op ...
правда.
Примеры:
1..10 -gt 5 # 6 7 8 9 10
'apple', 'banana', 'orange' -match 'e' # apple, orange
Булевы операторы, применяемые к коллекциям, удобны при правильном использовании. Но они также могут сбивать с толку и приводить к легким ошибкам:
$object = @(1, $null, 2, $null)
# "not safe" comparison with $null, perhaps a mistake
if ($object -eq $null) {
'-eq gets @($null, $null) which is evaluated to $true by if!'
}
# safe comparison with $null
if ($null -eq $object) {
'this is not called'
}
Еще один пример с -match
а также -notmatch
может выглядеть запутанно:
$object = 'apple', 'banana', 'orange'
if ($object -match 'e') {
'this is called'
}
if ($object -notmatch 'e') {
'this is also called, because "banana" is evaluated to $true by if!'
}
У меня была та же проблема, и точные строки работали из командной строки Powershell, но не из Powershell ISE или обычной командной строки. Если вы не хотите циклически проходить по всем строкам файла, используя foreach, вы можете просто преобразовать это в строку, подобную этой, и тогда она должна работать:
if([string](Get-Content -path $filePath) -match $pattern)
{
$matches[1]
}