2011-12-28 8 views
34

Pracuję z regex, aby dopasować zawartość pliku:

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

to zwraca true, mecz, jednak moja $ mecze zmienna pozostaje puste.

> $matches -eq $null 
True 

Czy w meczach $ nie ma grup meczów?

+0

Pokaż przykład z rzeczywistych danych - listy regex i dopasowany tekst. – tripleee

Odpowiedz

56

Ściśle mówiąc string -match ... i collection -match ... to dwa różne operatory. Pierwszy dostaje wartość typu Boolean i wypełnia $matches. Po drugie każdy element kolekcji pasuje do wzorca i najwyraźniej nie wypełnia $matches.

Twój przykład powinien działać zgodnie z oczekiwaniami, jeśli plik zawiera pojedynczą linię (działa pierwszy operator). Jeśli plik zawiera 2 wiersze, używany jest drugi operator i $matches nie jest ustawiony.

To samo dotyczy innych operatorów Boolean zastosowanych do kolekcji. To jest collection -op ... zwraca pozycje, w których item -op ... jest prawdziwe.

Przykłady:

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

operatorów logicznych stosowane do zbiorów są przydatne, jeśli są prawidłowo stosowane. ale mogą być mylące, jak również i doprowadzić do łatwo popełnić błędy:

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

Innym przykładem z -match i -notmatch może wyglądać mylące:

$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

Yup, to jest dokładnie to. Moja get-content zwraca tablicę, a ostatnia linia nie pasuje, powodując opróżnienie $ match. –

+6

Bardzo dokładna odpowiedź, @Roman! Z innej perspektywy (iz Alice in Wonderland twist!) Zainteresowani czytelnicy mogą również rzucić okiem na mój artykuł [Używanie porównania String String i funkcji filtrowania listy] (http://www.simple-talk.com/dotnet/. net-tools/harnessing-powershells-string-comparison-and-list-filtering-features /) opublikowane na Simple-Talk.com. Do artykułu dołączony jest schemat przedstawiający operatora '' '' '' w różnych kontekstach, wraz z wieloma innymi operatorami. –

+0

Szybka uwaga, spróbuj użyć 'foreach..' do przełączania się między elementami tablicy (może utworzyć warunkowe sprawdzanie' $ obj.gettype() '), możesz użyć' -match', jak tylko chcesz. .. warto zauważyć tę strategię, aby znaleźć konkretne dopasowania http://stackoverflow.com/a/3520237/843000 – mbrownnyc

5

miałem ten sam problem, a dokładne linie działają z wiersza polecenia Powershell, ale nie z Powershell ISE ani z normalnego wiersza polecenia. Jeśli ty nie chcesz, aby przejść przez wszystkie linie w pliku, jeden po drugim, używając foreach, można proste przekonwertować na ciąg w ten sposób i to powinno działać wtedy:

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