2011-12-28 14 views
34

estoy trabajando con una expresión regular para que coincida con el contenido del archivo:

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

esto devuelve cierto, un partido, sin embargo, mi $ coincide variable permanece nula.

> $matches -eq $null 
True 

¿No deberían $ coincidencias tener los grupos de coincidencia en él?

+0

muestran un ejemplo con datos reales - su regex y el texto que coincidió. – tripleee

Respuesta

56

Estrictamente hablando string -match ... y collection -match ... son dos operadores diferentes. El primero obtiene un valor booleano y rellena $matches. El segundo obtiene cada elemento de colección que coincide con un patrón y aparentemente no llena $matches.

Su ejemplo debería funcionar como espera si el archivo contiene una sola línea (el primer operador funciona). Si un archivo contiene más de 2 líneas, se usa el segundo operador y $matches no está configurado.

Lo mismo es cierto para otros operadores booleanos aplicados a una colección. Eso es collection -op ... devuelve elementos donde item -op ... es verdadero.

Ejemplos:

1..10 -gt 5 # 6 7 8 9 10 
'apple', 'banana', 'orange' -match 'e' # apple, orange 

operadores booleanos aplicadas a colecciones son muy útiles si se utiliza correctamente. Pero ellos pueden ser confusas, así y conducen a la fácil cometer errores:

$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' 
} 

Otro ejemplo con -match y -notmatch puede parecer confuso:

$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!' 
} 
+0

Sí, esto es exactamente eso. My get-content devuelve una matriz y la última línea no coincide, lo que hace que $ matches se vacíen. –

+6

Respuesta muy completa, @Roman! Para otra perspectiva (y con un toque de Alicia en el país de las maravillas), los lectores interesados ​​también pueden echar un vistazo a mi artículo [Aprovechar la comparación de cadenas de PowerShell y las características de filtrado de listas] (http://www.simple-talk.com/dotnet/. net-tools/harnessing-powershells-string-comparison-and-list-filtering-features /) publicado en Simple-Talk.com. Adjunto al artículo hay un gráfico que ilustra el operador '-match' (y sus variantes) tanto en el contexto escalar como en el contexto de la matriz, junto con muchos otros operadores. –

+0

Nota rápida, intente usar un 'foreach..' para recorrer los miembros de una matriz (tal vez crear un condicional para verificar' $ obj.gettype() '), luego puede usar' -match' como probablemente quiera. ... vale la pena señalar esta estrategia para encontrar coincidencias específicas http://stackoverflow.com/a/3520237/843000 – mbrownnyc

5

que tenían el mismo problema, y ​​las líneas exactas trabajaban desde el símbolo del sistema de Powershell pero no desde Powershell ISE o un símbolo del sistema normal. Si no' quiere visualizar todas las líneas del archivo uno por uno usando foreach, puede convertir simple que a una cadena como esta y debería funcionar a continuación:

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