con thành các group và đặt tên cho chúng như vậy khi lấy được 1 chuỗi kết quả ta muốn lấy các thành phần con bên trong đó thì ta chỉ cần gọi chúng thông qua tên đã đặt. Bạn có thể khôn[r]
Trang 1KHÓA C# CƠ BẢN HOWKTEAM.COM 1 | 60
Bài 28: REGULAR
EXPRESSION TRONG C#
Xem bài học trên website để ủng hộ Kteam:Regular Expression trong C#
Mọi vấn đề về lỗi website làm ảnh hưởng đến bạn hoặc thắc mắc, mong muốn khóa học mới, nhằm hỗ trợ cải thiện Website Các bạn vui lòng phản hồi đến Fanpage How Kteam nhé!
Bạn có thể trích lọc một hay nhiều chuỗi có cấu trúc chung từ một đoạn văn bản hay một chuỗi ra
Bạn có thể tìm kiếm, thay đổi nội dung của chuỗi một cách dễ dàng Thay vì phải ngồi cắt chuỗi mỏi mệt như trước đây
Từ đây, với Regular Expression Bạn hoàn toàn có thể trích lọc dữ liệu từ các đoạn html theo ý
Cùng nhau tìm hiểu cách sử dụng Regular Expression cơ bản với Kteam nhé
Nội dung
Để đọc hiểu bài này tốt nhất các bạn nên có kiến thức cơ bản về các phần:
Biết sơ về lập trình
Hiểu về chuỗi
Trang 2Copyright © Howkteam.com
Có khả năng tìm kiếm thêm thông tin trên internet tốt
Trong bài học này, chúng ta sẽ cùng tìm hiểu các vấn đề:
Các ký hiệu của Regular Expression
Một số lớp hỗ trợ trong Regular Expression
Các ký hiệu của Regular Expression
Trước khi tìm hiểu về các ký hiệu chúng ta cùng xem qua một ví dụ mẫu để nắm được cấu trúc chung của Regular Expression
Trang 3KHÓA C# CƠ BẢN HOWKTEAM.COM 3 | 60
Trong đó
\d là ký hiệu biểu thị cho số
{8} là biểu thị ký tự trước đó xuất hiện 8 lần
Vậy có thể đọc câu pattern này là: Tìm ra chuỗi con là dãy 8 số liên tiếp nhau
Hay có thể mường tượng Regular Expression này như string.Format
Từ đây bạn có thể nhận thấy Regular Expression bản chất là tìm ra một hoặc nhiều chuỗi con thỏa mãn cấu trúc chung được định ra
Hay hiểu cách khác Regular Expression là một tập khuôn mẫu định dạng
chuỗi Nhằm tìm kiếm chuỗi con một cách dễ dàng từ cấu trúc định dạng (@@ càng đọc càng ngu người Thôi tốt nhất không nên đọc dòng này Xóa dòng này ra khỏi não nha mọi người)
Bảng các ký hiệu Regular Expression thông dụng
Trang 4Copyright © Howkteam.com
Trang 5KHÓA C# CƠ BẢN HOWKTEAM.COM 5 | 60
Mình sẽ dùng phần mềm RegEx tester để demo cho các bạn xem cách dùng Regular Expression nhé
Link tải phần mềm ở cuối bài viết (Tại website www.howteam.com)
Trang 7KHÓA C# CƠ BẢN HOWKTEAM.COM 7 | 60
Pattern \d
Đại diện cho ký tự số Tương đương pattern [0-9]
Chuỗi mẫu:
Trang 9KHÓA C# CƠ BẢN HOWKTEAM.COM 9 | 60
Pattern \D
Ký tự không phải số Hay có thể hiểu là phủ định của \d
Chuỗi mẫu:
Trang 11KHÓA C# CƠ BẢN HOWKTEAM.COM 11 | 60
Pattern \s
Ký tự khoảng trắng Tương đương [\f\n\r\t\v]
Chuỗi mẫu:
Trang 13KHÓA C# CƠ BẢN HOWKTEAM.COM 13 | 60
Pattern \S
Ký tự không phải khoảng trắng Tương đương phủ định của \s hay tương đương [^\f\n\r\t\v]
Trang 15KHÓA C# CƠ BẢN HOWKTEAM.COM 15 | 60
Pattern \w
Ký tự word (gồm chữ cái và chữ số, dấu gạch dưới _ ) tương đương 9]
Trang 17KHÓA C# CƠ BẢN HOWKTEAM.COM 17 | 60
Pattern \W
Trang 19KHÓA C# CƠ BẢN HOWKTEAM.COM 19 | 60
Pattern ^
Bắt đầu một chuỗi hay một dòng
Chuỗi mẫu:
Trang 21KHÓA C# CƠ BẢN HOWKTEAM.COM 21 | 60
Pattern $
Trang 23KHÓA C# CƠ BẢN HOWKTEAM.COM 23 | 60
Pattern \A
Bắt đầu môt chuỗi
Chuỗi mẫu:
Trang 25KHÓA C# CƠ BẢN HOWKTEAM.COM 25 | 60
Pattern \z
Kết thúc một chuỗi
Chuỗi mẫu:
Trang 27KHÓA C# CƠ BẢN HOWKTEAM.COM 27 | 60
Pattern |
Ký tự so trùng tương đương với or Dùng để kết hợp nhiều điều kiện
Chuỗi mẫu:
Trang 29KHÓA C# CƠ BẢN HOWKTEAM.COM 29 | 60
Pattern [abc]
Khớp với một ký tự nằm trong nhóm này là a hay b hay c đều được
Chuỗi mẫu:
Trang 31KHÓA C# CƠ BẢN HOWKTEAM.COM 31 | 60
Pattern [a-z]
Khớp với ký tự trong khoảng a đến z a và z là ký tự hiện hữu trong bảng
ASCII
Trang 33KHÓA C# CƠ BẢN HOWKTEAM.COM 33 | 60
Pattern [^abc]
Không trùng bất kỳ ký tự a b hay c Tương đương phủ định của [abc]
Chuỗi mẫu:
Trang 35KHÓA C# CƠ BẢN HOWKTEAM.COM 35 | 60
Pattern ()
Xác định một group Một biểu thức đơn lẻ trong pattern
Chuỗi mẫu:
Trang 37KHÓA C# CƠ BẢN HOWKTEAM.COM 37 | 60
Pattern ?
Khớp với từ đứng trước xuất hiện 0 hay 1 lần
Chuỗi mẫu:
Trang 39KHÓA C# CƠ BẢN HOWKTEAM.COM 39 | 60
Pattern *
Khớp với từ đứng trước 0 lần trở lên
Chuỗi mẫu:
Trang 41KHÓA C# CƠ BẢN HOWKTEAM.COM 41 | 60
Pattern +
Khớp với từ đứng trước 1 lần trở lên
Chuỗi mẫu:
Trang 43KHÓA C# CƠ BẢN HOWKTEAM.COM 43 | 60
Pattern {n}
Với n là số Khớp với từ đứng trước xuất hiện đúng n lần
Chuỗi mẫu:
Trang 44Copyright © Howkteam.com
-howkteam.com 10092016-
Pattern:
0{2}
Lấy ra các kết quả là một cặp số 0 liền nhau
Hãy thử với n là một giá trị số khác nhé
Kết quả:
Trang 45KHÓA C# CƠ BẢN HOWKTEAM.COM 45 | 60
Pattern {n,}
Với n là số Khớp với từ đứng trước xuất hiện đúng n lần trở lên
Chuỗi mẫu:
Trang 47KHÓA C# CƠ BẢN HOWKTEAM.COM 47 | 60
Pattern {m,n}
Với m và n là số Khớp với từ đứng trước xuất hiện từ m đến n lần
Chuỗi mẫu:
Trang 49KHÓA C# CƠ BẢN HOWKTEAM.COM 49 | 60
Một số lớp hỗ trợ trong Regular
Expression
Trang 50Copyright © Howkteam.com
Match và MatchCollection
Khi áp dụng một biểu thức quy tắc lên một chuỗi mẫu nào đó thì kết quả trả
về có thể là nhiều chuỗi con thoả mãn biểu thức quy tắc trên Khi đó các chuỗi con sẽ được lưu vào trong 1 tập hợp có tên là MatchCollection, mỗi phần tử trong tập hợp là 1 biến có kiểu Match
MatchCollection là 1 kiểu tập hợp chứa danh sách các đối tượng kiểu Match
Vì đây cũng là 1 tập hợp bình thường nên có thể thao tác như các tập hợp khác
Một đối tượng kiểu Match sẽ chứa 1 chuỗi con kết quả, để xem chuỗi con kết quả này ta sẽ gọi phương thức ToString() Ngoài ra nó cũng có các thuộc tính
và phương thức khác như:
Ví dụ sử dụng Match và MatchCollection:
Cho chuỗi gốc là “-howkteam.com 10092016-” Giả sử bạn muốn lấy ra tất cả các số trong chuỗi Vậy pattern của chúng ta đơn giản chỉ là “\d”
Trang 51KHÓA C# CƠ BẢN HOWKTEAM.COM 51 | 60
Nếu bạn chỉ viết code đơn gian thế này:
Regex reg = new Regex(@"\d");
Match result = reg.Match("-howkteam.com 10092016-");
Console.WriteLine(result.ToString());
Thì kết quả sẽ như sau:
Chúng ta mong muốn lấy ra tất cả các số chứ không phải 1 số thế này! Đến đây có bạn sẽ làm như sau:
Regex reg = new Regex(@"\d"); // Tạo 1 đối tượng Regex chứa pattern của mình Match result = reg.Match("-howkteam.com 10092016-"); // Tạo 1 đối tượng Match để chứa kết quả
Trang 52Regex reg = new Regex(@"\d");
foreach (Match item in reg.Matches("-howkteam.com 10092016-"))
Kết quả khi chạy vẫn giống như cách trên:
Trang 53KHÓA C# CƠ BẢN HOWKTEAM.COM 53 | 60
Lớp Group là 1 lớp đại diện cho 1 gom nhóm trong biểu thức Có 1 điểm
chúng ta nên biết là lớp Group là lớp cha của lớp Match!
Tại sao lại có khái niệm này? – Bởi vì:
Trang 54Copyright © Howkteam.com
Trong 1 kết quả trùng khớp sẽ có thể chứa nhiều thông tin khác nhau
và ta mong muốn các thể lấy ra từng thành phần nhỏ trong đó mà không phải dùng thêm 1 biểu thức chính quy nào nữa
Và trong biểu thức chính quy ban đầu ta sẽ gom nhóm các thành phần con thành các group và đặt tên cho chúng như vậy khi lấy được 1 chuỗi kết quả ta muốn lấy các thành phần con bên trong đó thì ta chỉ cần gọi chúng thông qua tên đã đặt
Cú pháp:
(?<tên group>)
Trong đó:
( ): là cú pháp gom nhóm các biểu thức
?<tên group>: là cú pháp đặt tên cho group Bạn có thể không đặt tên
cho group cũng được Lưu ý là tên group bạn phải viết liền không dấu và nên tuân theo quy tắc đặt tên
Trang 55KHÓA C# CƠ BẢN HOWKTEAM.COM 55 | 60
Để lấy ra danh sách các gom nhóm trong 1 chuỗi con kết quả ta dùng thuộc
tính “Groups” trong lớp Match Thuộc tính này trả về 1 GroupCollection
GroupCollection là 1 lớp chứa danh sách các gom nhóm trong biểu thức, mỗi phần tử của danh sách là 1 đối tượng kiểu Group
* Duyệt qua các kết quả trùng khớp
* Lấy ra giá trị của các group thông qua chỉ số phần tử là tên các group đã đặt trong biểu thức
*/
foreach (Match item in re.Matches("30/04/2017 10:15:12 192.168.1.2"))
{
Console.WriteLine(" Match: " + item.ToString());
Console.WriteLine(" Hours: " + item.Groups["hours"]);
Console.WriteLine(" Minutes: " + item.Groups["minutes"]);
Console.WriteLine(" Seconds: " + item.Groups["seconds"]);
}
Kết quả khi chạy chương trình trên:
Trang 56Copyright © Howkteam.com
.NET đã hỗ trợ chúng ta truy xuất các phần tử trong danh sách
GroupCollection thông qua chỉ số phần tử là tên các group chúng ta đã đặt trong biểu thức ở trên
Capture và CaptureCollection
Mỗi khi tìm thấy bất kỳ 1 chuỗi con nào (bao gồm cả các group) thì C# sẽ bắt
nó lại và lưu vào 1 đối tượng có kiểu Capture Và danh sách tất cả các Capture chính là 1 CaptureCollection
Một điểm cần biết nữa là Capture là lớp cha của lớp Group!
Tại sao lại có lớp Capture này? – Câu trả lời sẽ nằm trong tình huống sau:
Cho chuỗi sau “10:30:15 IBM 192.168.1.2 INTEL” hãy viết biểu thức lấy ra giờ phút giây, địa chỉ ip và tên công ty
Lúc này ta sẽ có biểu thức sau:
“(?<times>(\d|:)+)\s(?<company>\S+)\s(?<ip>(\d|\.)+)\s(?<comp any>\S+)”
Lưu ý: là mình sẽ không tập trung vào giải thích chi tiết biểu thức mà tập
trung vào cách sử dụng các lớp
Ở đây mình có 2 tên công ty bên trong nên mình đặt chung 1 tên group là company với mong muốn lấy ra 2 tên công ty từ group
Chương trình kiểm tra:
Regex RE = new Regex(@"(?<times>(\d|:)+)\s" + @"(?<company>\S+)\s" +
@"(?<ip>(\d|\.)+)\s" + @"(?<company>\S+)");
foreach (Match item in RE.Matches("10:30:15 IBM 192.168.1.2 INTEL"))
{
Console.WriteLine(" time: " + item.Groups["times"]);
Console.WriteLine(" company: " + item.Groups["company"]);
Console.WriteLine(" ip: " + item.Groups["ip"]);
Console.WriteLine(" company: " + item.Groups["company"]);
Trang 57KHÓA C# CƠ BẢN HOWKTEAM.COM 57 | 60
}
Nhưng khi chạy chương trình kết quả lại như thế này:
Ta thấy có tới 2 công ty thoả mãn là INTEL và IBM nhưng chương trình chỉ in
ra được INTEL Chúng ta có thể kiểm tra bằng phần mềm RegEx Tester để chắc rằng biểu thức mình viết đúng:
Các bạn hãy để ý chỗ Group 4 (company) trong hình Rõ ràng ta lấy ra được 2 giá trị nhưng chỉ hiển thị được giá trị sau cùng
Trang 58Copyright © Howkteam.com
Đến đây có bạn sẽ nói rằng tại sao không đổi tên group khác đi là xong? Câu trả lời là trong ví dụ trên mình chỉ có 2 công ty nhưng giả sử có đến 100 công
ty trong chuỗi thì sao? Bạn phải đặt 100 biến khác nhau?
Vì thế chúng ta sẽ tận dụng đặc điểm của Capture và sử dụng chúng để giải quyết
Chương trình sẽ như sau:
Regex RE = new Regex(@"(?<times>(\d|:)+)\s" + @"(?<company>\S+)\s" +
@"(?<ip>(\d|\.)+)\s" + @"(?<company>\S+)");
foreach (Match item in RE.Matches("10:30:15 IBM 192.168.1.2 INTEL"))
{
Console.WriteLine(" time: " + item.Groups["times"]);
Console.WriteLine(" ip: " + item.Groups["ip"]);
Trang 59KHÓA C# CƠ BẢN HOWKTEAM.COM 59 | 60
Tải phần mềm
Bạn có thể tải phần mềm RegEx tester tại link bên dưới:
Kết luận
Nội dung bài này giúp các bạn nắm được:
Các ký hiệu của Regular Expression
Một số lớp hỗ trợ trong Regular Expression
Như từ giờ bạn hoàn toàn tự tin để CRAWL DATA TỪ WEBSITE hay các chuỗi lớn rồi nhé
Trang 60Copyright © Howkteam.com
Cảm ơn các bạn đã theo dõi bài viết Hãy để lại bình luận hoặc góp ý của mình
để phát triển bài viết tốt hơn Đừng quên “Luyện tập – Thử thách – Không ngại khó”