2011-12-20 38 views
5

Hãy nói rằng tôi có một chuỗi:Powershell Regex - tên nhóm tùy chọn phù hợp với

$string1 = "Hello_World:How, are, you:-all -is -well" 

Tôi muốn sử dụng một regex để phù hợp với các phần của chuỗi phân cách bằng ruột của thành các nhóm được đặt tên. Ví dụ:

$pattern = "(?<first>.*)\:(?<second>.*)\:(?<third>.*)" 

$ này sẽ phù hợp với mô hình $ string1 thành công và tôi sẽ kết thúc với các trận đấu như sau:

first=Hello_World 
second=How, are, you 
third=-all -is -well 

này là tốt, nhưng có một vấn đề. $ String1 có khả năng thiếu phần thứ ba, ví dụ:

Thật không may, $ string1 này không còn phù hợp với mẫu regex nữa. Làm thế nào để làm cho nó để các mô hình sẽ phù hợp với cả hai định dạng của chuỗi? (tức là tôi luôn phải có trận đấu "đầu tiên" và "thứ hai" và chỉ có trận đấu "thứ ba" nếu trận đấu được cung cấp).

Trả lời

5

Sử dụng định lượng ? và nhóm không chụp. Ngoài ra, không sử dụng .*!

(?<first>[^:]*):(?<second>[^:]*)(?::(?<third>.*))? 

Ngoài ra, bạn nên neo regex ít nhất là lúc đầu.

2

@ câu trả lời FGE của nên làm việc, nhưng nếu điều này là tất cả các bạn đang làm, tôi sẽ khuyên bạn nên sử dụng String.split để có được những gì bạn cần:

$split = $string1.split(':') 
if(($split.count -eq 2) -or ($split.count -eq 3)){ 
    #use $split[0] etc. 
} 
+0

Yep, đó là đơn giản hơn. Tuy nhiên, tôi ngần ngại cung cấp cho +1 này miễn là OP xác nhận rằng các phần khác nhau _do not_ chứa ':' - không phải là giải pháp của tôi xử lý điều này một cách chính xác, heh. – fge

Các vấn đề liên quan