Powershell: оператор match возвращает true, но значение $matches равно null
Я работаю с регулярным выражением, чтобы соответствовать содержимому файла:
> (get-content $_) -match $somePattern
the line of text that matches the pattern
Это возвращает true, совпадение, однако моя переменная $matches остается null.
> $matches -eq $null
True
Разве в $matches не должны быть группы совпадений?
2 ответов:
Строго говоря
string -match ...иcollection -match ...- это два разных оператора. Первый получает логическое значение и заполняет$matches. Второй получает каждый элемент коллекции, который соответствует шаблону и, по-видимому, не заполняет$matches.Ваш пример должен работать так, как вы ожидаете, если файл содержит одну строку (первый оператор работает). Если файл содержит 2 + строки, то используется второй оператор и
$matchesне задается.То же самое справедливо и для других булевых операторов, применяемых к a коллекция. То есть
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] }
Comments