1. Trang chủ
  2. » Cao đẳng - Đại học

Chuyên đề Regular Expression trong C HowKtea khóa học lập trình cơ bản | Toán học, Lớp 12 - Ôn Luyện

60 56 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 60
Dung lượng 1,11 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 1

KHÓ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 2

Copyright © 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 3

KHÓ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 4

Copyright © Howkteam.com

Trang 5

KHÓ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 7

KHÓ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 9

KHÓ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 11

KHÓ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 13

KHÓ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 15

KHÓ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 17

KHÓA C# CƠ BẢN HOWKTEAM.COM 17 | 60

Pattern \W

Trang 19

KHÓ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 21

KHÓA C# CƠ BẢN HOWKTEAM.COM 21 | 60

Pattern $

Trang 23

KHÓA C# CƠ BẢN HOWKTEAM.COM 23 | 60

Pattern \A

Bắt đầu môt chuỗi

Chuỗi mẫu:

Trang 25

KHÓA C# CƠ BẢN HOWKTEAM.COM 25 | 60

Pattern \z

Kết thúc một chuỗi

Chuỗi mẫu:

Trang 27

KHÓ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 29

KHÓ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 31

KHÓA C# CƠ BẢN HOWKTEAM.COM 31 | 60

Pattern [a-z]

Khớp với ký tự trong khoảng a đến z az là ký tự hiện hữu trong bảng

ASCII

Trang 33

KHÓ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 35

KHÓ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 37

KHÓ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 39

KHÓ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 41

KHÓ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 43

KHÓ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 44

Copyright © 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 45

KHÓ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 47

KHÓ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 49

KHÓA C# CƠ BẢN HOWKTEAM.COM 49 | 60

Một số lớp hỗ trợ trong Regular

Expression

Trang 50

Copyright © 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 51

KHÓ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 52

Regex 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 53

KHÓ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 54

Copyright © 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 55

KHÓ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 56

Copyright © 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 57

KHÓ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 58

Copyright © 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 59

KHÓ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 60

Copyright © 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ó”

Ngày đăng: 21/04/2021, 23:20

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w