2011-12-28 27 views
34

tôi đang làm việc với một regex để phù hợp với nội dung file:

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

này trả về true, một trận đấu, tuy nhiên $ của tôi phù hợp với biến vẫn là null.

> $matches -eq $null 
True 

Không phải các kết quả phù hợp $ có các nhóm đối sánh trong đó không?

+0

Hiện một ví dụ với dữ liệu thực tế - bạn regex và văn bản phù hợp. – tripleee

Trả lời

56

Nói đúng cách string -match ...collection -match ... là hai toán tử khác nhau. Giá trị đầu tiên nhận được giá trị Boolean và điền $matches. Thứ hai nhận mỗi mục bộ sưu tập phù hợp với một mẫu và dường như không điền $matches.

Ví dụ của bạn sẽ hoạt động như bạn mong đợi nếu tệp có chứa một dòng (toán tử đầu tiên hoạt động). Nếu tệp có chứa 2 dòng trở lên thì toán tử thứ hai được sử dụng và $matches không được đặt.

Điều này cũng đúng đối với các toán tử Boolean khác được áp dụng cho bộ sưu tập. Đó là collection -op ... trả về các mục có số item -op ... là đúng.

Ví dụ:

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

toán tử Boolean áp dụng cho các bộ sưu tập thuận tiện nếu sử dụng đúng cách. Nhưng họ có thể gây nhầm lẫn như tốt và dẫn đến dễ mắc sai lầm:

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

Một ví dụ khác với -match-notmatch có thể nhìn khó hiểu:

$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, đây chính là nó. Nội dung nhận của tôi trả về một mảng và dòng cuối cùng không khớp, làm cho các kết quả $ để trống. –

+6

Câu trả lời rất kỹ lưỡng, @Roman! Đối với một quan điểm khác (và với một Alice in Wonderland twist!) Người đọc quan tâm cũng có thể xem xét bài viết của tôi [Khai thác tính năng So sánh chuỗi và danh sách lọc của PowerShell] (http://www.simple-talk.com/dotnet/. net-tools/harnessing-powershells-string-so-và-list-filtering-features /) được xuất bản trên Simple-Talk.com. Kèm theo bài viết là một wallchart minh họa toán tử '-match' (và các biến thể) trong cả bối cảnh vô hướng và mảng, cùng với nhiều toán tử khác. –

+0

Lưu ý nhanh, hãy thử sử dụng 'foreach..' để chuyển qua các thành viên của mảng (có thể tạo điều kiện để kiểm tra' $ obj.gettype() '), sau đó bạn có thể sử dụng' -match' như bạn có thể muốn. .. đáng chú ý chiến lược này để tìm các trận đấu cụ thể http://stackoverflow.com/a/3520237/843000 – mbrownnyc

5

tôi đã cùng một vấn đề, và các đường chính xác đã làm việc từ dấu nhắc lệnh Powershell nhưng không phải từ Powershell ISE hoặc dấu nhắc lệnh bình thường. Nếu bạn không' muốn để lướt qua tất cả các dòng của tập tin từng người một sử dụng foreach, bạn có thể chuyển đổi đơn giản mà thành một chuỗi như thế này và nó sẽ làm việc sau đó:

if([string](Get-Content -path $filePath) -match $pattern) 
{ 
    $matches[1] 
} 
Các vấn đề liên quan