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
Trả lời
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 match
và group #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ổ.
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
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'. –
Đố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 –
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)
- 1. Sự khác nhau giữa Oracle Streams và Thay đổi dữ liệu Capture là gì?
- 2. Sự khác nhau giữa mã hóa .NET và PHP
- 3. Sự khác nhau giữa Java và C# và .NET
- 4. Sự khác nhau giữa C#, .NET và CLI là gì?
- 5. Sự khác nhau giữa System.DateTime.Now và System.DateTime.Today
- 6. Sự khác nhau giữa IQueryable và IEnumerable
- 7. Capture đầu ra Stored Procedure in trong .NET (mô hình khác nhau!)
- 8. Sự khác nhau giữa REST và WebServices
- 9. sự khác biệt giữa tổng hợp ($ match) và tìm thấy, trong MongoDB?
- 10. Sự khác nhau giữa .Equals và ==
- 11. Sự khác nhau giữa% w và% W
- 12. Sự khác nhau giữa ParameterInfo.DefaultValue và ParameterInfo.RawDefaultValue
- 13. Sự khác nhau giữa MBean và MXBean
- 14. Sự khác nhau giữa ConfigurationManager và ConfigurationSettings
- 15. Sự khác nhau giữa Tkinter và Tkinter
- 16. Sự khác nhau giữa! = Và =! trong Java?
- 17. Sự khác nhau giữa 'SpecialFolder.LocalApplicationData' và 'SpecialFolder.ApplicationData'?
- 18. Sự khác nhau giữa String.getBytes() và IOUtils.toByteArray()?
- 19. Sự khác nhau giữa presentModalViewController và presentViewController?
- 20. Sự khác nhau giữa tải vs DOMContentLoaded
- 21. Sự khác nhau giữa NSInvocationOperation và NSBlockOperation
- 22. Sự khác nhau giữa TVar và TMVar
- 23. Sự khác nhau giữa onClickListener và onItemClickListener
- 24. Sự khác nhau giữa các loại regex
- 25. Sự khác nhau giữa `require` và` gem`
- 26. Sự khác nhau giữa HttpUtility.HtmlEncode và Server.HtmlEncode
- 27. Sự khác nhau giữa sqlplus và sqldeveloper?
- 28. Sự khác nhau giữa JPA và JPA2
- 29. Sự khác nhau giữa DECIMAL và NUMERIC
- 30. Sự khác nhau giữa "./somescript.sh" và ". ./somescript.sh"
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