Powershell: оператор совпадения возвращает значение true, но $ match имеет значение null - PullRequest
36 голосов
/ 28 декабря 2011

Я работаю с регулярным выражением для сопоставления содержимого файла:

> (get-content $_) -match $somePattern
the line of text that matches the pattern

это возвращает true, совпадение, однако моя переменная $ match остается нулевой.

> $matches -eq $null
True

Разве в $ match не должно быть групп совпадений?

Ответы [ 2 ]

62 голосов
/ 28 декабря 2011

Строго говоря, string -match ... и collection -match ... - это два разных оператора.Первый получает логическое значение и заполняет $matches.Второй получает каждый элемент коллекции, который соответствует шаблону и, очевидно, не заполняет $matches.

Ваш пример должен работать так, как вы ожидаете, если файл содержит одну строку (первый оператор работает).Если файл содержит 2+ строки, то используется второй оператор и $matches не задан.

То же самое верно для других логических операторов, применяемых к коллекции.То есть collection -op ... возвращает элементы, для которых item -op ... имеет значение true.

Примеры:

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!'
}
9 голосов
/ 17 февраля 2016

У меня была та же проблема, и точные строки работали из командной строки Powershell, но не из Powershell ISE или обычной командной строки. Если вы не хотите циклически проходить по всем строкам файла, используя foreach, вы можете просто преобразовать это в строку, подобную этой, и она должна работать тогда:

if([string](Get-Content -path $filePath) -match $pattern)
{
   $matches[1]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...