Cơ bản về Regular Expression trong C# P2

5.Lớp GroupCollection:

Là lớp tượng trưng cho 1 tập hợp gồm toàn những nhóm được thu lượm và trả về một lô những nhóm được thu lượm trong một lần so khớp duy nhất. Collection này thuộc loại read-only và không có phương thức khởi tạo. Các thể hiện của lớp GroupCollection được trả về trong tập hợp mà thuộc tính Match.Groups trả về.
Ví dụ: dò tìm và in ra số những nhóm được thu lượm bởi một RE. Làm thế nào để trích từng thu lượm riêng rẽ trên mỗi thành viên của môt group collection.

01using System;
02using System.Collections.Generic;
03using System.Text;
04using System.Text.RegularExpressions;
05  
06namespace ConsoleApplication1
07{
08    class Program
09    {
10        static void Main(string[] args)
11        {
12            Regex myRegex = new Regex("(a(b))c");
13            Match m = myRegex.Match("abdabc");
14            Console.WriteLine("So nhom duoc tim thay la: {0}",m.Groups.Count);
15        }
16    }
17}
Kết quả:
6.Lớp Cature:

Lớp này chứa những kết quả từ một thu lượm duy nhất dựa trên một expression-con (sub-expression)

7.Lớp CatureCollection:

Mỗi lần một đối tượng Regex khớp với một subexpression, một thể hiện Capture sẽ được tạo ra, và được thêm vào tập hợp CaptureCollection. Mỗi đối tượng Capture tượng trưng cho một thu lượm (capture) đơn lẻ. Mỗi nhóm sẽ có riêng cho mình một capture collection những mục khớp với subexpression được gắn liền với nhóm.
Lớp CaptureCollection tượng trưng cho một loạt những chuỗi con được thu lượm và trả về một lô những thu lượm được thực hiện chỉ qua một nhóm thu lượm duy nhất. Thuộc tính Captures, một đối tượng của lớp CaptureCollection, được cung cấp như là một thành viên của các lớp Match và Group giúp truy xuất dễ dàng lô các chuỗi con được thu lượm.
Ví dụ: nếu bạn sử dụng regular expression ((a(b)c)+ (dấu + cho biết là một hoặc nhiều chuỗi so khớp) để thu lượm những so khớp từ chuỗi chữ “abcabcabc”. CaptureCollection đối với mỗi matching Group của những substring sẽ chứa 3 thành viên.
Ví dụ sau đây mình dùng đến regular expression (Abc)+ để tìm ra một hoặc nhiều so khớp trên chuỗi “XYZAbcAbcAbcXYZAbcAb”. Ví dụ minh họa việc sử dụng thuộc tính Captures để trả về nhiều nhóm các chuỗi con bị thu lượm:
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string chuoi = "XYZAbcAbcAbcXYZAbcAb";
            string pattern = "(Abc)+";
            Regex myRegex = new Regex(pattern);
            Match m = myRegex.Match(chuoi);
            GroupCollection gc = m.Groups;
            CaptureCollection cc;
            Console.WriteLine("So nhom thu luom duoc = {0}",gc.Count.ToString());
            Console.WriteLine();
            for(int i=0;i<gc.Count;i++)
            {
                cc = gc[i].Captures;
                Console.WriteLine("So capture = " + cc.Count.ToString());
                for(int j=0;j< cc.Count;j++)
                {
                    Console.WriteLine(cc[j] + " bat dau tu ky tu " + cc[j].Index);
                }
                Console.WriteLine();
            }
        }
    }
}

Kết quả:


1So nhom thu luom duoc = 2
2  
3So capture = 1
4AbcAbcAbc bat dau tu ky tu 3
5  
6So capture = 3
7Abc bat dau tu ky tu 3
8Abc bat dau tu ky tu 6
9Abc bat dau tu ky tu 9
Sử dụng lớp CaptureCollection:

Thuộc tính chủ chốt của đối tượng Capture là Length, cho biết chiều dài của chuỗi con bị thu lượm. Khi bạn yêu cầu Match cho biết chiều dài, thì chính Capture.Length bạn tìm thấy, vì Match được thừa kế từ Group, và Group lại được dẫn xuất từ Capture.
Điển hình, bạn sẽ chỉ tìm thấy một Capture đơn độc trong mộg CaptureCollection; nhưng điều này không buộc phải như thế. Điều gì sẽ xảy ra nếu bạn phân tích ngữ nghĩa một chuỗi trong ấy tên công ty có thể xuất hiện hoặc ở hai nơi. Muốn gộp các tên này vào chung thành một match đơn lẻ, bạn tạo nhóm ?<company> ở 2 nơi trong pattern của regular expression.
Đoạn mã sau cho rảo qua tập hợp Capture đối với nhóm company:
1foreach(Capture cap in match.Groups["company"].Captures)
Compiler bắt đầu bằng cách tìm ra tập hợp mà ta rảo qua trên ấy. match là một đối tượng có một tập hợp mang tên Groups. Tập hợp Groups có bộ chỉ mục (indexer) cho phép trích một chuỗi và trả về một đối tượng Group đơn lẻ. Do đó, lệnh sau đây trả về một đối tượng Group đơn lẻ:
Đến phiên, vòng lặp foreach rảo qua tập hợp Captures, trích mỗi phần tử trong tập hợp và gán cho biến toàn cục cap, thuộc kiểu dữ liệu Capture. Bạn có thể là trên kết xuất có 2 phần tử capture: NEVERLAND và TNHH. Phần tử thứ hai đè chồng lên phần tử đầu trên nhóm, do đó chỉ in ra TNHH, nhưng khi quan sát tập hợp Captures thì bạn thấy có 2 trị bị thu lượm.
Kết quả của ví dụ trên:

1Match: 05:04:27 NEVERLAND 192.168.10.1 TNHH
2Time: 05:04:27
3IP: 192.168.10.1
4Company: TNHH
5  
6cap: NEVERLAND
7cap: TNHH
============ các phần mềm hổ trợ test Regex ======
Comment