2010-02-12 27 views
6

Tôi đang tạo một ứng dụng nhỏ bằng cách sử dụng các loại .NET Regex. Và các loại "Capture, Group and Match" hoàn toàn làm tôi bối rối. Tôi chưa bao giờ thấy một giải pháp xấu xí như vậy. Ai đó có thể giải thích cách sử dụng của họ cho tôi? Cảm ơn nhiều.Sự khác nhau giữa .NET Capture, Group, Match

+0

Bạn có biểu hiện chính quy ví dụ mà bạn muốn chúng tôi giải thích không? – Gumbo

Trả lời

12

Dưới đây là một ví dụ đơn giản hơn so với một trong các tài liệu @Dav trích dẫn:

string s0 = @"foo%123%456%789"; 
Regex r0 = new Regex(@"^([a-z]+)(?:%([0-9]+))+$"); 
Match m0 = r0.Match(s0); 
if (m0.Success) 
{ 
    Console.WriteLine(@"full match: {0}", m0.Value); 
    Console.WriteLine(@"group #1: {0}", m0.Groups[1].Value); 
    Console.WriteLine(@"group #2: {0}", m0.Groups[2].Value); 
    Console.WriteLine(@"group #2 captures: {0}, {1}, {2}", 
        m0.Groups[2].Captures[0].Value, 
        m0.Groups[2].Captures[1].Value, 
        m0.Groups[2].Captures[2].Value); 
} 

kết quả:

full match: foo%123%456%789
group #1: foo
group #2: 789
group #2 captures: 123, 456, 789

Kết quả full matchgroup #1 rất đơn giản, nhưng các kết quả khác yêu cầu một số giải thích. Nhóm # 2, như bạn có thể thấy, nằm trong nhóm không chụp được kiểm soát bởi một số liệu thống kê +. Nó khớp với ba lần, nhưng nếu bạn yêu cầu Value, bạn chỉ nhận được những gì nó khớp với lần thứ ba xung quanh - lần chụp cuối cùng. Tương tự, nếu bạn sử dụng trình giữ chỗ $2 trong chuỗi thay thế, lần chụp cuối cùng là thứ được chèn vào vị trí của nó.

Trong hầu hết các hương vị regex, đó là tất cả những gì bạn có thể nhận được; mỗi lần chụp trung gian bị ghi đè bởi lần tiếp theo và bị mất; .NET gần như là duy nhất trong việc bảo toàn tất cả các ảnh chụp và làm cho chúng có sẵn sau khi kết hợp được thực hiện. Bạn có thể truy cập chúng trực tiếp như tôi đã làm ở đây hoặc lặp qua số CaptureCollection như bạn sẽ là MatchCollection. Tuy nhiên, không có tương đương với các trình giữ chỗ chuỗi thay thế kiểu dáng $1.

Vì vậy, lý do thiết kế API quá xấu (như bạn đặt) là gấp đôi: đầu tiên nó đã được chuyển thể từ hỗ trợ regex tích phân của Perl sang khung hướng đối tượng của .NET; sau đó cấu trúc CaptureCollection được ghép vào nó. Perl 6 cung cấp một giải pháp sạch hơn nhiều, nhưng các tác giả đã hoàn thành điều đó bằng cách viết lại Perl thực tế từ đầu và ném khả năng tương thích ngược ra ngoài cửa sổ.

+1

Xin chào, cảm ơn Alan. Chỉ còn 2 câu hỏi nữa, có một thuộc tính có tên là "Captures" cho cả Match và Group, sự khác nhau giữa Match.Captures và Group.Captures là gì? Và tại sao Match.Groups [0] luôn giống như Match.Value? Cảm ơn một lần nữa. – smwikipedia

+0

Kết hợp ISA Group ISA Capture, do đó, đối sánh kế thừa 'Captures' từ Group và' Value' từ Capture. Trận đấu là nhóm thứ hai, vì vậy 'Match.Captures' chỉ đơn giản là danh sách một phần tử chứa toàn bộ kết quả - như thể chúng ta cần * một cách khác * để tham chiếu đến nó! 'Giá trị' rõ ràng là cách ưa thích, ngắn hơn và trực quan hơn nhiều. Nhưng ngay cả đó là tùy chọn nếu bạn sử dụng tham chiếu Match/Group/Capture mà dự kiến ​​một chuỗi, bởi vì 'ToString()' chỉ đại diện cho 'Value'. –

+0

Đối với * tại sao * Kết quả phù hợp là Nhóm thứ hai, hãy xem câu trả lời này: http://stackoverflow.com/questions/2248213/in-c-regular-expression-why-does-the-initial-match-show -up-in-the-groups/2248767 # 2248767 –

2

Trận đấu là kết quả của bất kỳ trận đấu riêng lẻ nào của số toàn bộ của regex. Cả nhóm và ảnh chụp đều có liên quan đến các nhóm chụp (mỗi (expression) từ bên trong regex), nhưng khác nhau về cách chúng hoạt động. Dưới đây là một trích dẫn từ bài viết MSDN trên lớp Capture giải thích sự khác biệt:

Nếu bạn không áp dụng một lượng hóa cho một nhóm chụp, các Group.Captures tài sản trả về một CaptureCollection với một đối tượng Capture đơn rằng cung cấp thông tin về việc chụp giống như đối tượng Nhóm. Nếu bạn áp dụng một lượng hóa đến một nhóm chụp, các Group.Index, Group.Length, và tài sản Group.Value cung cấp thông tin chỉ về nhóm bị bắt cuối cùng, trong khi Capture đối tượng trong CaptureCollection cung cấp thông tin về tất cả các ảnh chụp hiển thị phụ. Ví dụ cung cấp minh họa.

(Source)

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