Thứ bảy, ngày 3 tháng 12 năm 2016

Các lớp để thao tác với Regular Expression trong .NET Phần 1

Ngày đăng: 1/3/2012, 8:54:22AM | Lượt xem: 2,374
Hot!

 

  

Ký hiệu          Diễn giải
.               đại diện cho 1 ký tự bất kỳ trừ ký tự xuống dòng \n.
\d              ký tự chữ số tương đương [0-9]
\D              ký tự ko phải chữ số
\s              ký tự khoảng trắng tương đương [ \f\n\r\t\v]
\S              ký tự không phải khoảng trắng tương đương [ ^\f\n\r\t\v]
\w              ký tự word (gồm chữ cái và chữ số, dấu gạch dưới _ ) tương đương [a-zA-Z_0-9]
\W              ký tự không phải ký tự word tương đương [^a-zA-Z_0-9]
^               bắt đầu 1 chuỗi hay 1 dòng
$               kết thúc 1 chuỗi hay 1 dòng
\A              bắt đầu 1 chuỗi
\z              kết thúc 1 chuỗi
|               ký tự ngăn cách so trùng tương đương với phép or (lưu ý cái này nếu muốn kết hợp nhiều điều kiện)
[abc]           khớp với 1 ký tự nằm trong nhóm là a hay b hay c.
[a-z]           so trùng với 1 ký tự nằm trong phạm vi a-z, dùng dấu - làm dấu ngăn cách.
[^abc]          sẽ không so trùng với 1 ký tự nằm trong nhóm, ví dụ không so trùng với a hay b hay c.
()              Xác định 1 group (biểu thức con) xem như nó là một yếu tố đơn lẻ trong pattern .ví dụ ((a(b))c) sẽ khớp với b, ab, abc.
?               khớp với đứng trước từ 0 hay 1 lần. Ví dụ A?B sẽ khớp với B hay AB.
*               khớp với đứng trước từ 0 lần trở lên . A*B khớp với B, AB, AAB
+               khớp với đứng trước từ 1 lần trở lên. A+B khớp với AB, AAB.
{n}             n là con số, Khớp đúng với n ký tự đúng trước nó . Ví dụ A{2}) khớp đúng với 2 chữ A.
{n, }           khớp đúng với n ký tự trở lên đứng trước nó , A{2,} khớp vói AA, AAA ...
{m,n}           khớp đùng với từ m->n ký tự đứng trước nó, A{2,4} khớp vói AA,AAA,AAAA.

 

Các lớp để thao tác với Regular Expression trong .NET:

.NET cung cấp một cách tiếp cận hướng đối tượng về việc so khớp chuỗi và thay thế theo RE. System.Text.RegularExpression là namespace trên thư viện các lớp chuẩn của .NET liên quan đến tất cả các đối tượng gắn liền với RE. Sau đây mình xin giới thiệu sơ lược về các lớp này:

Regex:

Lớp Regex tượng trưng cho 1 regular expression bất di bất dịch (read-only). Nó cũng chứa một phương thức tĩnh (static) cho phép chúng ta sử dụng những lớp rex khác mà khỏi khởi tạo 1 đối tượng khác. Ví dụ:

    string pattern = @"\s2000";
    Regex myRegex = new Regex(pattern);

Sau đây, mình sẽ kể ra vài thành phần của lớp Regex này:

-Thuộc tính:

+Options: trả về những mục chọn được trao qua cho constructor Regex.

+RightToLeft: nhận 1 trị cho biết liệu xem regular expression dò tìm từ phải qua trái hay không

-Phương thức:

+GetGroupNames: trả về mảng gồm toàn tên nhóm thu lượm đối với RE.

+GetGroupNumbers: trả về mảng gồm toàn số nhóm thu lượm tương ứng với tên nhóm trên 1 mảng.

+GroupNameFromNumber: đi lấy tên nhóm tương ứng với số nhóm được khai báo.

+IsMatch: trả về trị bool cho biết liệu xem RE có tìm thấy một so khớp hay không trên pattern.

+Match: dò tìm trên pattern xem có xuất hiện một RE hay không rồi trả về kết quả chính xác như là một đối tượng Match duy nhất.

+Matches: dò tìm trên pattern xem tất cả các xuất hiện của một RE có hay không rồi trả về tất cả những so khớp thành công xem như Match được gọi nhiều lần.

+Replace: cho thay thế những xuất hiện của một pattern được định nghĩa bởi một RE bởi một chuỗi ký tự thay thế được chỉ định.

+Split: chẻ một pattern thành một mảng gồm những chuỗi con ở những vị trí được chỉ định bởi một so khớp trên RE

+Unescape: cho unescape bất cứ những ký tự nào được escape trên pattern.

Sau đây là ví dụ sử dụng lớp Regex để tách chuỗi qua việc dùng phương thức Split của nó:

string chuoi = "Mot, Hai, Ba, Bon.";
//tạo pattern
//luật: xem chuỗi nào có chứa khoảng trắng hay dấu phẩy
string pattern = " |, ";
Regex myRegex = new Regex(pattern);
string[] sKetQua = myRegex.Split(chuoi);
foreach (string subString in sKetQua)
{
    Console.WriteLine(subString);
}

Và đây là kết quả của nó:

Mot
Hai
Ba
Bon

Như bạn thấy , phương thức khởi tạo của class Regex sẽ nhận 1 chuỗi pattern làm đối số. Có vẻ hơi khó hiểu! Trong phạm trù của 1 chương trình C#, đâu là expression: văn bản được trao cho constructor, hay là bản thân đối tượng Regex? Đúng là chuỗi pattern là một RE theo kiểu cổ điển của từ. Tuy nhiên, theo quan điểm của C#, đối mục của constructor chỉ đơn giản là 1 chuỗi ký tự: myRegex là đối tượng Regular expression.

Phương thức Regex.Split() hoạt động cũng giống như String.Split(), trả về 1 mảng chuỗi như là kết quả việc so khớp pattern của RE trong lòng myRegex.


Lớp Match:

Lớp này tượng trưng cho những kết quả duy nhất của một tác vụ so khớp (match) RE. Sau đây mình có 1 ví dụ nhỏ sử dụng phương thức Match của lớp Regex để trả về 1 đối tượng kiểu Match để có thể tìm ra so khớp đầu tiên trên chuỗi nhập.
Sử dụng thuộc tính Match.Access của lớp Match báo cho biết liệu xem đã tìm ra 1 so khớp hay chưa.

string chuoi = "123abcd456bdabc";
string pattern = "abc";
Regex myRegex = new Regex(pattern);
Match m = myRegex.Match(chuoi);
if (m.Success)
{
    Console.WriteLine("Tim thay chuoi con {0} o vi tri thu {1} trong chuoi", m.Value, m.Index);
}
else
   Console.WriteLine("Khong tim thay chi ca");

Kết quả như sau:

Tim thay chuoi con abc o vi tri thu 3 trong chuoi

Lớp MatchCollection

Lớp này tượng trưng cho 1 loạt những so khớp thành công đè chồng lên nhau tạo thành một tập hợp bất di bất dịch và lớp này không có phương thức khởi tạo. Nhũng đối tượng MatchCollection sẽ do thuộc tính Regex.Matches của lớp Regex trả về.

Hiểu nôm na MatchCollection là mảng các đối tượng Match là được.
Ví dụ:

static void Main(string[] args)
{
    //tập hợp chứa những so khớp
    MatchCollection mc;
    //1 chuỗi thử nghiệm
    string chuoi = "I like money, like woman and like C#";
    //tạo pattern
    string pattern = "like";
    //khởi tạo 1 đối tượng của Regex
   //truyền chuỗi pattern vào constructor
   Regex myRegex = new Regex(pattern);
   //dùng phương thức Matches của myRegex
   //để tìm ra matches và chỉ mục của từng match
   mc = myRegex.Matches(chuoi);
   foreach (Match m in mc)
   {
       Console.WriteLine("Chuoi con '{0}' xuat hien o chi muc {1}", m.Value, m.Index);
   }
}

Ta có kết quả sau:

    Chuoi con 'like' xuat hien o chi muc 2
    Chuoi con 'like' xuat hien o chi muc 14
    Chuoi con 'like' xuat hien o chi muc 29

Sử dụng Regex Match Collections:

Hai thuộc tính của đối tượng Match là chiều dài và vị trí của nó, mà ta có thể đọc như ví dụ sau:

static void Main(string[] args)
{
    //tập hợp chứa những so khớp
    MatchCollection mc;
    //1 chuỗi thử nghiệm
    string chuoi = "This is a example string.";
    //tạo pattern
    //luật:cho tìm ra bất cứ những ký tự không phải ký tự khoảng trắng
    //rồi theo sau nó là kí tự khoảng trắng
   string pattern = @"\S+\s";
   //khởi tạo 1 đối tượng của Regex
   //truyền chuỗi pattern vào constructor
   Regex myRegex = new Regex(pattern);
   //dùng phương thức Matches của myRegex
   //để tìm ra matches và chỉ mục của từng match
   mc = myRegex.Matches(chuoi);
   for (int i = 0; i < mc.Count; i++)
   {
       Console.WriteLine("The match[{0}]: '{1}' co chieu dai la {2}", i,mc[i].Value, mc[i].Length);
   }
}

Chuỗi \S đi tìm những ký tự không phải khoảng trắng, và dấu + cho biết một hoặc nhiều ký tự ở đằng sau. Còn \s (s thường nhá) cho biết là khoảng trắng. Do đó, gộp lại ta có mệnh đề “hãy đi tìm bất cứ ký tự non-whitespace theo sau bởi whitespace”.

Kết quả của ví dụ trên là:

    The match[0]: 'This ' co chieu dai la 5
    The match[1]: 'is ' co chieu dai la 3
    The match[2]: 'a ' co chieu dai la 2
    The match[3]: 'example ' co chieu dai la 8

Lý do từ chót “string.” không được tìm thấy là vì nó có kết thúc là dấu chấm (không phải khoảng trắng).

 

 

congdongcviet_neverland
 Chia sẻ qua: 
Hot!
Ý kiến bạn đọc

These items will be permanently deleted and cannot be recovered. Are you sure?

Gallery

image

Maecenas viverra rutrum pulvinar

Maecenas viverra rutrum pulvinar! Aenean vehicula nulla sit amet metus aliquam et malesuada risus aliquet. Vestibulum rhoncus, dolor sit amet venenatis porta, metus purus sagittis nisl, sodales volutpat elit lorem…

Read more

Text Links

Thiết kế logo chuyên nghiệp Insky
DAFABET
W88 w88b.com/dang-ky-tai-khoan-w88
W88
Copyright © 2011 - 2012 vietshare.vn by phamkhuong102@gmail.com doanhkisi2315@gmail.com. All rights reserved.