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 не должны быть группы совпадений?

713   2  

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

    Ничего не найдено.