Ví d 10.7 bt đầu bng vic to mt chui tìm kiếm đơn
gin:
string string1 = “Ngon ngu lap trinh C Sharp”;
và mt biu thc quy tc để thc hin vic tìm kiếm trên chui string1:
Regex theReg = new Regex(@”(\S+)\s”);
Chui \S tìm ký t không phi ký t trng và du cng ch ra rng có th có mt hay
nhiu ký
t. Chui \s (ch thường) ch ra khong trng. Kết hp li tìm mt chui
không có khong trng bên trong nhưng theo sau cùng là mt khong trng. Chúng
ta lưu ý khai báo chui biu thc quy tc dng chui 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 thy. T cui cùng không được tìm
thy
bi vì nó không đưc theo sau bi khong trng. Nếu chúng ta chèn mt khong trng
sau ch “Sharp” và trước du ngoc đóng, thì chương trình s tìm được thêm ch
“Sharp”.
Thuc tính Length là chiu dài ca chui con tìm kiếm được. Chúng ta s tìm hiu sâu
hơn v thuc tính này trong phn s dng lp CaptureCollection cui chương.
S dng Regex để gom nhóm
Đôi khi lp trình chúng ta cn gom nhóm mt sc biu thc tương t vi nhau
theo mt quy định nào đó. Ví d như chúng ta cn tìm kiếm địa ch IP và nhóm
chúng li vào trong nhóm IPAddresses được tìm thy bt c đâu trong mt chui.
Lp Group cho phép chúng ta to nhng nhóm và tìm kiếm da trên biu thc quy tc,
và th hin kết qu t mt nhóm biu thc đơn.
Mt biu thc nhóm định rõ mt nhóm và cung cp mt biu thc quy tc, bt c
chui con nào được so khp bi biu thc quy tc thì s được thêm vào trong nhóm.
Ví d, để to mt nhóm chúng ta có th viết như sau:
@”(?<ip>(\d|\ .)+)\s”
Lp Match dn xut t nhóm Group, và có mt tp hp gi là Groups cha tt c các
nhóm mà Match m thy.
Vic to và s dng tp hp Groups và lp Group được minh ha trong ví d 10.8 như
sau:
Ví d minh ha 10.8: S dng lp 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 thi gian bng mt hay nhiu con s hay du :
// và theo sau bi khong trng.
Regex theReg = new Regex(@”(?<time>(\d|\:)+)\s” +
// địa ch IP là mt hay nhiu con s hay du chm theo
// sau bi khong trng
@”(?<ip>(\d|\.)+)\s” +
// địa ch web là mt hay nhiu ký t
@”(?<site>\S+)”);
// ly mt tp hp các chui được so khp
MatchCollection theMatches = theReg.Matches( string1 );
// s dng vòng lp để ly các chui trong tp hp
foreach (Match theMatch in theMatches)
{
if (theMatch.Length != 0)
{
Console.WriteLine(“\ntheMatch: {0}”, theMatch.ToString());
// hin th thi gian
Console.WriteLine(“Time: {0}”, theMatch.Groups[“time”]);
// hin th địa ch IP
Console.WriteLine(“IP: {0}”, theMatch.Groups[“ip”]);
// hin 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 ha 10.8 bt đầu bng vic to mt chui đơn gin đểm kiếm như sau:
string string1 = “10:20:30 127.0.0.0 Dolphin.net”;
Chui này có th được tìm thy trong ni dung ca các tp tin log ghi nhn các thông
tin web server hay t các kết qu tìm kiếm được trong cơ s d liu. Trong ví d đơn
gin này
ba ct, mt ct đầu tiên ghi nhn thi gian, ct th hai ghi nhn địa ch IP, và ct th
ba ghi nhn địa ch web. Mi ct được ngăn cách bi khong trng. Dĩ nhiên là trong
các ng dng thc tế ta phi gii quyết nhng vn đề phc tp hơn na, chúng ta có
th cn phi thc hin vic tìm kiếm phc tp hơn và s dng nhiu ký t ngăn cách
hơn na.
Trong ví d này, chúng ta mong mun là to ra mt đối tượng Regex để tìm kiếm chui
con yêu cu và phân chúng vào trong ba nhóm: time, địa ch IP, và địa ch web. Biu
thc quy tc đây cũng khá đơn gin, do đó cũng d hiu.
đây chúng ta quan tâm đến nhng ký t to nhóm như:
<?<time>
Du ngoc đơn dùng để to nhóm. Mi th gia du ngoc m trước du ? du
ngoc đóng (trong trường hp này sau du +) được xác định là mt nhóm. Chui
?<time> định ra tên ca nhóm và liên quan đến tt c các chui ký t được so khp theo
biu thc quy tc (\d| \:)+)\s. Biu thc này th được din gii như: “mt hay nhiu
con s hay nhng du : theo sau bi mt khong trng”.
Tương t như vy, chui ?<ip> định tên ca nhóm ip, và ?<site> là tên ca nhóm site.
Tiếp theo là mt tp hp được định nghĩa để nhn tt c các chui con được so khp
như sau:
MatchCollection theMatches = theReg.Matches( string1 );
Vòng lp foreach được dùng để ly ra các chui con được tìm thy trong tp hp.
Nếu chiu dài Length ca Match là ln hơn 0, tc là tìm thy thì chúng ta s xut ra
chui được tìm thy:
Console.WriteLine(“\ntheMatch: {0}”, theMatch.ToString());
Và kết qu ca ví d là:
theMatch: 10:20:30 127.0.0.0 Dolphin.net
Sau đó chương trình ly nhóm time t tp hp nhóm ca Match xut ra màn hình
bng các lnh như sau:
Console.WriteLine(“time: {0}”, theMatch.Groups[“time”]);
Kết qu là :
Time: 10:20:30
Tương t như vy vi nhóm ip và site:
Console.WriteLine(“IP: {0}”, theMatch.Groups[“ip”]);
// hin th địa ch web site
Console.WriteLine(“site: {0}”, theMatch.Groups[“site”]);
Ta nhn được kết qu:
IP: 127.0.0.0
Site: Dolphin.net
Trong ví d 10.8 trên thì tp hp Match ch so khp duy nht mt ln. Tuy nhiên, nó có
th so khp nhiu hơn na trong mt chui. Để làm được điu này, chúng ta có th b
sung chui tìm kiếm được ly t trong mt 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 ”;
Chui này s to ra ba chui con so khp được tìm thy trong MatchCollection. Và kết
qu ta
có th thy đượ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 phn b sung, thì theMatches cha ba đối tượng Match. Mi ln lp
thì các chui con được tìm thy (ba ln) và chúng ta có th xut ra chui cũng như
tng nhóm riêng bên trong ca chui con được tìm thy.
S dng lp CaptureCollection
Mi khi mt đối tượng Regex tìm thy mt chui con, thì môt th hin Capture được
to
ra và được thêm vào trong mt tp hp CaptureCollection. Mi mt đối tượng
Capture th hin mt chui con riêng. Mi nhóm có mt tp hp các Capture được
tìm thy trong chui con có liên h vi nhóm.