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]
(1)KHÓA C# CƠ BẢN HOWKTEAM.COM 1 | 60
Bài 28: REGULAR
EXPRESSION TRONG C#
Xem học website để ủng hộ Kteam:Regular Expression C#
Mọi vấn đề lỗi website làm ảnh hưởng đến bạn 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é!
Dẫn nhập
Regular Expression hay tiếng Việt gọi Biểu thức quy, cấu trúc mạnh để mơ tả chuỗi theo cách thống chung
Regular Expression bao gồm tập hợp ký tự, toán tử hay ký hiệu toán học nhằm biểu thị chuỗi theo cấu trúc chung mà người học theo Có thể xem Regular Expression loại tiếng lóng dùng chung lập trình Bạn trích lọc hay nhiều chuỗi có cấu trúc chung từ đoạn văn hay chuỗi
Bạn tìm kiếm, thay đổi nội dung chuỗi cách dễ dàng Thay phải ngồi cắt chuỗi mỏi mệt trước
Từ đây, với Regular Expression Bạn hồn tồn trích lọc liệu từ đoạn html theo ý
Cùng tìm hiểu cách sử dụng Regular Expression với Kteam
Nội dung
Để đọc hiểu tốt bạn nên có kiến thức phần:
(2)Copyright © Howkteam.com
Có khả tìm kiếm thêm thơng tin internet tốt
Trong học này, tìm hiểu vấn đề:
Các ký hiệu Regular Expression
Một số lớp hỗ trợ Regular Expression
Các ký hiệu Regular Expression Trước tìm hiểu ký hiệu xem qua ví dụ mẫu để nắm cấu trúc chung Regular Expression
Chuỗi mẫu:
-howkteam.com-10092016- Pattern:
\d{8}
Kết tìm kiếm: 10092016 Một cách nhìn khác:
-howkteam.com-10092016- Hay cách dễ nhớ
(3)KHÓA C# CƠ BẢN HOWKTEAM.COM 3 | 60 Trong
\d ký hiệu biểu thị cho số
{8} biểu thị ký tự trước xuất lần
Vậy đọc câu pattern là: Tìm chuỗi dãy số liên tiếp
>>> kết trùng khớp
Nếu bạn thay số thành số tức pattern thành : \d{6}
Thì kết thành 100920 hay -howkteam.com-10092016- Hay cách dễ nhớ
-howkteam.com-\d{6}16-
Hay mường tượng Regular Expression như string.Format
Từ bạn nhận thấy Regular Expression chất tìm nhiều chuỗi thỏa mãn cấu trúc chung định
Hay hiểu cách khác Regular Expression tập khn mẫu định dạng chuỗi Nhằm tìm kiếm chuỗi cách dễ dàng từ cấu trúc định dạng (@@ đọc ngu người Thôi tốt khơng nên đọc dịng Xóa dịng khỏi não nha người)
(4)(5)KHÓA C# CƠ BẢN HOWKTEAM.COM 5 | 60
Mình dùng phần mềm RegEx tester để demo cho bạn xem cách dùng Regular Expression
Link tải phần mềm cuối viết (Tại website www.howteam.com)
Pattern
Đại diện cho ký tự Ngoại trừ ký hiệu \n Chuỗi mẫu:
(6)Copyright © Howkteam.com
Kết quả:
Danh sách ký tự xuất chuỗi mẫu: {-,h,o,w,k, ,1,6,-} Cách nhìn khác:
(7)KHÓA C# CƠ BẢN HOWKTEAM.COM 7 | 60
Pattern \d
(8)Copyright © Howkteam.com -howkteam.com-10092016-
Pattern: \d Kết quả:
Danh sách số xuất chuỗi mẫu: {1,0,0,9,2,0,1,6} Cách nhìn khác:
(9)KHĨA C# CƠ BẢN HOWKTEAM.COM 9 | 60
Pattern \D
(10)Copyright © Howkteam.com -howkteam.com-10092016-
(11)KHÓA C# CƠ BẢN HOWKTEAM.COM 11 | 60
Pattern \s
(12)Copyright © Howkteam.com -howkteam.com 10092016-
Pattern:
(13)KHÓA C# CƠ BẢN HOWKTEAM.COM 13 | 60
Pattern \S
(14)Copyright © Howkteam.com Chuỗi mẫu:
-howkteam.com 10092016- Pattern:
(15)KHÓA C# CƠ BẢN HOWKTEAM.COM 15 | 60
Pattern \w
(16)Copyright © Howkteam.com Chuỗi mẫu:
-howkteam.com 10092016- Pattern:
(17)KHÓA C# CƠ BẢN HOWKTEAM.COM 17 | 60
(18)Copyright © Howkteam.com Ký tự khơng phải word Tương đương phủ định \w hay [^a-zA-Z_0-9] Chuỗi mẫu:
-howkteam.com 10092016- Pattern:
(19)KHÓA C# CƠ BẢN HOWKTEAM.COM 19 | 60
Pattern ^
(20)Copyright © Howkteam.com -howkteam.com 10092016-
Pattern:
(21)KHÓA C# CƠ BẢN HOWKTEAM.COM 21 | 60
(22)Copyright © Howkteam.com Kết thúc chuỗi hay dòng
Chuỗi mẫu:
-howkteam.com 10092016- Pattern:
(23)KHÓA C# CƠ BẢN HOWKTEAM.COM 23 | 60
(24)Copyright © Howkteam.com -howkteam.com 10092016-
Pattern:
(25)KHÓA C# CƠ BẢN HOWKTEAM.COM 25 | 60
(26)Copyright © Howkteam.com -howkteam.com 10092016-
(27)KHÓA C# CƠ BẢN HOWKTEAM.COM 27 | 60
Pattern |
(28)Copyright © Howkteam.com -howkteam.com 10092016-
Pattern:
(29)KHÓA C# CƠ BẢN HOWKTEAM.COM 29 | 60
Pattern [abc]
(30)Copyright © Howkteam.com -howkteam.com 10092016-
(31)KHÓA C# CƠ BẢN HOWKTEAM.COM 31 | 60
Pattern [a-z]
(32)Copyright © Howkteam.com Chuỗi mẫu:
-howkteam.com 10092016- Pattern:
(33)KHÓA C# CƠ BẢN HOWKTEAM.COM 33 | 60
Pattern [^abc]
(34)Copyright © Howkteam.com -howkteam.com 10092016-
Pattern:
(35)KHÓA C# CƠ BẢN HOWKTEAM.COM 35 | 60
Pattern ()
(36)Copyright © Howkteam.com -howkteam.com 10092016-
Pattern:
([0-3])|([5-7])
(37)KHÓA C# CƠ BẢN HOWKTEAM.COM 37 | 60
Pattern ?
(38)Copyright © Howkteam.com -howkteam.com 10092016-
Lấy tất số xuất hay lần Pattern:
(39)KHÓA C# CƠ BẢN HOWKTEAM.COM 39 | 60
Pattern *
(40)Copyright © Howkteam.com -howkteam.com 10092016-
(41)KHÓA C# CƠ BẢN HOWKTEAM.COM 41 | 60
Pattern +
(42)Copyright © Howkteam.com -howkteam.com 10092016-
(43)KHÓA C# CƠ BẢN HOWKTEAM.COM 43 | 60
Pattern {n}
(44)Copyright © Howkteam.com -howkteam.com 10092016-
Pattern: 0{2}
(45)KHÓA C# CƠ BẢN HOWKTEAM.COM 45 | 60
Pattern {n,}
(46)Copyright © Howkteam.com -howkteam.com 10092016-
(47)KHÓA C# CƠ BẢN HOWKTEAM.COM 47 | 60
Pattern {m,n}
(48)Copyright © Howkteam.com -howkteam.com 100010092016-
Pattern:
(49)KHÓA C# CƠ BẢN HOWKTEAM.COM 49 | 60
(50)Copyright © Howkteam.com
Match MatchCollection
Khi áp dụng biểu thức quy tắc lên chuỗi mẫu kết trả nhiều chuỗi thoả mãn biểu thức quy tắc Khi chuỗi lưu vào tập hợp có tên MatchCollection, phần tử tập hợp biến có kiểu Match
MatchCollection kiểu tập hợp chứa danh sách đối tượng kiểu Match Vì tập hợp bình thường nên thao tác tập hợp khác
Một đối tượng kiểu Match chứa chuỗi kết quả, để xem chuỗi kết ta gọi phương thức ToString() Ngồi có thuộc tính phương thức khác như:
Ví dụ sử dụng Match MatchCollection:
(51)KHÓA C# CƠ BẢN HOWKTEAM.COM 51 | 60 Nếu bạn viết code đơn gian này:
Regex reg = new Regex(@"\d");
Match result = reg.Match("-howkteam.com 10092016-"); Console.WriteLine(result.ToString());
Thì kết sau:
Chúng ta mong muốn lấy tất số khơng phải số này! Đến có bạn làm sau:
Regex reg = new Regex(@"\d"); // Tạo đối tượng Regex chứa pattern Match result = reg.Match("-howkteam.com 10092016-"); // Tạo đối tượng Match để chứa kết
{
Console.WriteLine(result.ToString());
result = result.NextMatch(); // Chuyển qua kết trùng khớp }
while (result != Match.Empty); // Kiểm tra xem hết kết trùng khớp chưa
(52)Copyright © Howkteam.com Kết ý ta thấy code không gọn gàng thời gian xử lý chỗ hàm NextMatch()
Đến ta thử sử dụng MatchCollection NET hỗ trợ sẵn xem nào:
Regex reg = new Regex(@"\d");
foreach (Match item in reg.Matches("-howkteam.com 10092016-")) {
Console.WriteLine(item.ToString()); }
Để ý lúc ta dùng hàm Matches() để lấy kết Match() Matches() trả tập hợp đối tượng Match (MatchCollection) nên ta dùng foreach để duyệt tập hợp (cú pháp foreach bạn tham khảo FOREACH TRONG C# series LẬP TRÌNH C# CƠ BẢN)
(53)KHÓA C# CƠ BẢN HOWKTEAM.COM 53 | 60
Lưu ý:
Nếu khơng tìm thấy chuỗi phù hợp trả đối tượng Match có giá trị rỗng khơng phải null Khi để kiểm tra có giá trị hay khơng ta sử dụng:
if (result == Match.Empty) {
// Câu lệnh }
Group GroupCollection
Group Regular Expression cách ta gom nhóm biểu thức lại thành cụm đặt tên cho nhóm để dễ quản lý thao tác
Lớp Group lớp đại diện cho gom nhóm biểu thức Có điểm nên biết lớp Group lớp cha lớp Match!
(54)Copyright © Howkteam.com
Trong kết trùng khớp chứa nhiều thông tin khác
và ta mong muốn thể lấy thành phần nhỏ mà khơng phải dùng thêm biểu thức quy
Và biểu thức quy ban đầu ta gom nhóm thành phần
con thành group đặt tên cho chúng lấy chuỗi kết ta muốn lấy thành phần bên ta cần gọi chúng thông qua tên đặt
Cú pháp:
(?<tên group>) Trong đó:
( ): cú pháp gom nhóm biểu thức
?<tên group>: cú pháp đặt tên cho group Bạn khơng đặt tên cho group Lưu ý tên group bạn phải viết liền không dấu nên tuân theo quy tắc đặt tên
Ví dụ:
Để lấy chuỗi phút giây ta làm sau:
“\d+:\d+:\d+”
Nhưng muốn lấy giờ, phút, giây riêng để xử lý phải làm sao?
Nếu viết biểu thức dài dịng Khi ta sử dụng group đặt tên cho chúng sau:
(?<hours>\d+):(?<minutes>\d+):(?<seconds>\d+)
(55)KHÓA C# CƠ BẢN HOWKTEAM.COM 55 | 60 Để lấy danh sách gom nhóm chuỗi kết ta dùng thuộc tính “Groups” lớp Match Thuộc tính trả GroupCollection GroupCollection lớp chứa danh sách gom nhóm biểu thức, phần tử danh sách đối tượng kiểu Group
Ví dụ sử dụng Group GroupCollection:
// Tạo biểu thức Regex re = new
Regex(@"(?<hours>\d+):(?<minutes>\d+):(?<seconds>\d+)"); /*
* Duyệt qua kết trùng khớp
* Lấy giá trị group thông qua số phần tử tên group đặt 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"]); }
(56)Copyright © Howkteam.com NET hỗ trợ truy xuất phần tử danh sách
GroupCollection thông qua số phần tử tên group đặt biểu thức
Capture CaptureCollection
Mỗi tìm thấy chuỗi (bao gồm group) C# bắt lại lưu vào đối tượng có kiểu Capture Và danh sách tất Capture CaptureCollection
Một điểm cần biết Capture lớp cha lớp Group!
Tại lại có lớp Capture này? – Câu trả lời nằm tình sau:
Cho chuỗi sau “10:30:15 IBM 192.168.1.2 INTEL” viết biểu thức lấy
giờ phút giây, địa ip tên cơng ty Lúc ta có biểu thức sau:
“(?<times>(\d|:)+)\s(?<company>\S+)\s(?<ip>(\d|\.)+)\s(?<comp any>\S+)”
Lưu ý: 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 lớp
Ở có tên cơng ty bên nên đặt chung tên group company với mong muốn lấy 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"]);
(57)KHÓA C# CƠ BẢN HOWKTEAM.COM 57 | 60
}
Nhưng chạy chương trình kết lại này:
Ta thấy có tới công ty thoả mãn INTEL IBM chương trình in INTEL Chúng ta kiểm tra phần mềm RegEx Tester để biểu thức viết đúng:
(58)Copyright © Howkteam.com Đến có bạn nói không đổi tên group khác xong? Câu trả lời ví dụ có cơng ty giả sử có đến 100 cơng ty chuỗi sao? Bạn phải đặt 100 biến khác nhau?
Vì tận dụng đặc điểm Capture sử dụng chúng để giải
Chương trì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"]); Console.Write(" company: ");
/*
Lấy tất capture bắt group company duyệt chúng
* Sau ta sử dụng hàm ToString() thuộc tính Value để lấy giá trị Capture
*/
foreach (Capture i in item.Groups["company"].Captures) {
Console.Write(i.ToString() + " "); }
}
Ở để lấy danh sách Capture (CaptureCollection) ta sử dụng thuộc tính Captures
(59)KHĨA C# CƠ BẢN HOWKTEAM.COM 59 | 60
Tải phần mềm
Bạn tải phần mềm RegEx tester link bên dưới:
Kết luận
Nội dung giúp bạn nắm được:
Các ký hiệu Regular Expression
Một số lớp hỗ trợ Regular Expression
(60) KHÓA C# CƠ BẢN HOWKTEAM.COM Regular Expression C# e www.howteam.com FOREACH TRONG C# LẬP TRÌNH C# CƠ BẢN CRAWL DATA TỪ WEBSITE