
Ví dụ 10.7 bắt đầu bằng việc tạo một chuỗi tìm kiếm đơn
giản:
string string1 = “Ngon ngu lap trinh C Sharp”;
và một biểu thức quy tắc để thực hiện việc tìm kiếm trên chuỗi string1:
Regex theReg = new Regex(@”(\S+)\s”);
Chuỗi \S tìm ký tự không phải ký tự trắng và dấu cộng chỉ ra rằng có thể có một hay
nhiều ký
tự. Chuỗi \s (chữ thường) chỉ ra là khoảng trắng. Kết hợp lại là tìm một chuỗi
không có khoảng trắng bên trong nhưng theo sau cùng là một khoảng trắng. Chúng
ta lưu ý khai báo chuỗi biểu thức quy tắc dạng chuỗi nguyên văn để dễ dàng dùng các
ký tự escape như (\).
Kết quả được trình bày là năm từ đầu tiên được tìm thấy. Từ cuối cùng không được tìm
thấy
bởi vì nó không được theo sau bởi khoảng trắng. Nếu chúng ta chèn một khoảng trắng
sau chữ “Sharp” và trước dấu ngoặc đóng, thì chương trình sẽ tìm được thêm chữ
“Sharp”.
Thuộc tính Length là chiều dài của chuỗi con tìm kiếm được. Chúng ta sẽ tìm hiểu sâu
hơn về thuộc tính này trong phần sử dụng lớp CaptureCollection ở cuối chương.
Sử dụng Regex để gom nhóm
Đôi khi lập trình chúng ta cần gom nhóm một số các biểu thức tương tự với nhau
theo một quy định nào đó. Ví dụ như chúng ta cần tìm kiếm địa chỉ IP và nhóm
chúng lại vào trong nhóm IPAddresses được tìm thấy bất cứ đâu trong một chuỗi.
Lớp Group cho phép chúng ta tạo những nhóm và tìm kiếm dựa trên biểu thức quy tắc,
và thể hiện kết quả từ một nhóm biểu thức đơn.
Một biểu thức nhóm định rõ một nhóm và cung cấp một biểu thức quy tắc, bất cứ
chuỗi con nào được so khớp bởi biểu thức quy tắc thì sẽ được thêm vào trong nhóm.
Ví dụ, để tạo một nhóm chúng ta có thể viết như sau:
@”(?<ip>(\d|\ .)+)\s”
Lớp Match dẫn xuất từ nhóm Group, và có một tập hợp gọi là Groups chứa tất cả các
nhóm mà Match tìm thấy.
Việc tạo và sử dụng tập hợp Groups và lớp Group được minh họa trong ví dụ 10.8 như
sau:
Ví dụ minh họa 10.8: Sử dụng lớp Group.
-----------------------------------------------------------------------------
namespace Programming_CSharp
{
using System;
using System.Text.RegularExpressions;
class Tester

{
public static void Main()
{
string string1 = “10:20:30 127.0.0.0 Dolphin.net”;
// nhóm thời gian bằng một hay nhiều con số hay dấu :
// và theo sau bởi khoảng trắng.
Regex theReg = new Regex(@”(?<time>(\d|\:)+)\s” +
// địa chỉ IP là một hay nhiều con số hay dấu chấm theo
// sau bởi khoảng trắng
@”(?<ip>(\d|\.)+)\s” +
// địa chỉ web là một hay nhiều ký tự
@”(?<site>\S+)”);
// lấy một tập hợp các chuỗi được so khớp
MatchCollection theMatches = theReg.Matches( string1 );
// sử dụng vòng lặp để lấy các chuỗi trong tập hợp
foreach (Match theMatch in theMatches)
{
if (theMatch.Length != 0)
{

Console.WriteLine(“\ntheMatch: {0}”, theMatch.ToString());
// hiển thị thời gian
Console.WriteLine(“Time: {0}”, theMatch.Groups[“time”]);
// hiển thị địa chỉ IP
Console.WriteLine(“IP: {0}”, theMatch.Groups[“ip”]);
// hiển thị địa chỉ web site
Console.WriteLine(“Site: {0}”, theMatch.Groups[“site”]);
}// end if
}// end foreach
}// end Main
}// end class
}// end namespace
-----------------------------------------------------------------------------
Ví dụ minh họa 10.8 bắt đầu bằng việc tạo một chuỗi đơn giản để tìm kiếm như sau:
string string1 = “10:20:30 127.0.0.0 Dolphin.net”;
Chuỗi này có thể được tìm thấy trong nội dung của các tập tin log ghi nhận các thông
tin ở web server hay từ các kết quả tìm kiếm được trong cơ sở dữ liệu. Trong ví dụ đơn
giản này có
ba cột, một cột đầu tiên ghi nhận thời gian, cột thứ hai ghi nhận địa chỉ IP, và cột thứ
ba ghi nhận địa chỉ web. Mỗi cột được ngăn cách bởi khoảng trắng. Dĩ nhiên là trong
các ứng dụng thực tế ta phải giải quyết những vấn đề phức tạp hơn nữa, chúng ta có
thể cần phải thực hiện việc tìm kiếm phức tạp hơn và sử dụng nhiều ký tự ngăn cách
hơn nữa.
Trong ví dụ này, chúng ta mong muốn là tạo ra một đối tượng Regex để tìm kiếm chuỗi
con yêu cầu và phân chúng vào trong ba nhóm: time, địa chỉ IP, và địa chỉ web. Biểu
thức quy tắc ở đây cũng khá đơn giản, do đó cũng dễ hiểu.
Ở đây chúng ta quan tâm đến những ký tự tạo nhóm như:
<?<time>
Dấu ngoặc đơn dùng để tạo nhóm. Mọi thứ giữa dấu ngoặc mở trước dấu ? và dấu
ngoặc đóng (trong trường hợp này sau dấu +) được xác định là một nhóm. Chuỗi
?<time> định ra tên của nhóm và liên quan đến tất cả các chuỗi ký tự được so khớp theo
biểu thức quy tắc (\d| \:)+)\s. Biểu thức này có thể được diễn giải như: “một hay nhiều
con số hay những dấu : theo sau bởi một khoảng trắng”.
Tương tự như vậy, chuỗi ?<ip> định tên của nhóm ip, và ?<site> là tên của nhóm site.
Tiếp theo là một tập hợp được định nghĩa để nhận tất cả các chuỗi con được so khớp
như sau:
MatchCollection theMatches = theReg.Matches( string1 );

Vòng lặp foreach được dùng để lấy ra các chuỗi con được tìm thấy trong tập hợp.
Nếu chiều dài Length của Match là lớn hơn 0, tức là tìm thấy thì chúng ta sẽ xuất ra
chuỗi được tìm thấy:
Console.WriteLine(“\ntheMatch: {0}”, theMatch.ToString());
Và kết quả của ví dụ là:
theMatch: 10:20:30 127.0.0.0 Dolphin.net
Sau đó chương trình lấy nhóm time từ tập hợp nhóm của Match và xuất ra màn hình
bằng các lệnh như sau:
Console.WriteLine(“time: {0}”, theMatch.Groups[“time”]);
Kết quả là :
Time: 10:20:30
Tương tự như vậy với nhóm ip và site:

Console.WriteLine(“IP: {0}”, theMatch.Groups[“ip”]);
// hiển thị địa chỉ web site
Console.WriteLine(“site: {0}”, theMatch.Groups[“site”]);
Ta nhận được kết quả:
IP: 127.0.0.0
Site: Dolphin.net
Trong ví dụ 10.8 trên thì tập hợp Match chỉ so khớp duy nhất một lần. Tuy nhiên, nó có
thể so khớp nhiều hơn nữa trong một chuỗi. Để làm được điều này, chúng ta có thể bổ
sung chuỗi tìm kiếm được lấy từ trong một log file như sau:
String string1 = “10:20:30 127.0.0.0 Dolphin.net ” +
“10:20:31 127.0.0.0 Mun.net ” +
“10:20:32 127.0.0.0 Msn.net ”;
Chuỗi này sẽ tạo ra ba chuỗi con so khớp được tìm thấy trong MatchCollection. Và kết
quả ta
có thể thấy được là:
theMatch: 10:20:30 127.0.0.0 Dolphin.net
Time: 10:20:30
IP: 127.0.0.0
site: Dolphin.net
theMatch: 10:20:31 127.0.0.0 Mun.net
Time: 10:20:31
IP: 127.0.0.0
Site: Mun.net
theMatch: 10:20:32 127.0.0.0 Msn.net
time: 10:20:32
IP: 127.0.0.0
Site: Msn.net
Trong ví dụ này phần bổ sung, thì theMatches chứa ba đối tượng Match. Mỗi lần lặp
thì các chuỗi con được tìm thấy (ba lần) và chúng ta có thể xuất ra chuỗi cũng như
từng nhóm riêng bên trong của chuỗi con được tìm thấy.
Sử dụng lớp CaptureCollection
Mỗi khi một đối tượng Regex tìm thấy một chuỗi con, thì môt thể hiện Capture được
tạo
ra và được thêm vào trong một tập hợp CaptureCollection. Mỗi một đối tượng
Capture thể hiện một chuỗi con riêng. Mỗi nhóm có một tập hợp các Capture được
tìm thấy trong chuỗi con có liên hệ với nhóm.