Powershell:match运算符返回true但$ matches为null

时间:2011-12-28 04:37:51

标签: regex powershell

我正在使用正则表达式来匹配文件内容:

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

这返回true,匹配,但是我的$ matches变量保持为null。

> $matches -eq $null
True

$ match不应该包含匹配组吗?

2 个答案:

答案 0 :(得分:62)

严格来说,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!'
}

答案 1 :(得分:8)

我遇到了同样的问题,确切的行是从Powershell命令提示符开始的,但不是来自Powershell ISE或正常的命令提示符。如果你不想使用foreach逐个遍历文件的所有行,你可以简单地将它转换为这样的字符串,它应该可以工作:

if([string](Get-Content -path $filePath) -match $pattern)
{
   $matches[1]
}