Regex Trong C#

Đến với bài viết hôm nay chúng ta sẽ bắt đầu tìm hiểu một kỹ thuật khá thú vị trong lập trình CSharp .NET. Kỹ thuật này hỗ trợ mạnh mẽ cho việc xử lý chuỗi như tìm kiếm, so khớp, cắt ghép… Kỹ thuật tôi đang nói tới là Regular Expressions – Không chỉ trong CSharp mà trong mọi ngôn ngữ lập trình khác đều hỗ trợ regular Expression để phục vụ cho việc xử lý văn bản. Trong các ứng dụng xử lý văn bản bạn cũng sẽ gặp Regular Expression trong chức năng tìm kiếm và thay thế (Find/ Replace) như: Word, Excel, Dreamwave, Notepad++…

Regex là gì?

Regular Expression còn gọi ngắn gọn là Regex – Tập hợp các phép xử lý văn bản như tìm kiếm, so khớp, cắt ghép… Regex làm việc dựa trên những mẫu văn bản theo các quy tắc định sẵn trước để từ đó xử lý những văn bản khác theo các yêu cầu khác nhau. Các mẫu văn bản có sẵn gọi là partern. Để sử dụng Regex trong csharp bạn cần sử dụng namespace System.Text.RegularExpression. Trong các bài tiếp theo chúng ta sẽ lần lượt làm rõ từng khái niệm, thuộc tính, phương thức trong Regular Expression.

Ví dụ về Regular Expression

Đây là ví dụ đơn giản về Regex trong việc xử lý chuỗi, ví dụ này cho thấy được tính năng mạnh mẽ của Regex, thay vì phải tự dùng các hàm xử lý string thì Regex hỗ trợ sẵn các hàm xử lý rất thông dụng. Ví dụ bên dưới thực thi công việc gửi 1 Request là tên 1 bài hát lên server của mp3.zing.vn sau đó nhận html trả về. Tiếp theo phân tích html để tách kết quả là đường link trỏ đến các bài hát trên mp3.zing.vn. Từ dòng 20 -> 24 xử lý gửi và nhận thông tin từ mp3.zing.vn. Dòng thứ 2 có nhiệm vụ tách các kết quả từ html trả về. Sau đó lần lượt xử lý các kết quả và đưa ra richTextBox.

re1

Phương Thức Match() Trong Regex

Trong bài viết lần trước chúng ta đã tìm hiểu một số nét căn bản về Regular Expression trong lập trình csharp; Bài viết này ta sẽ tìm hiểu phần tiếp theo trong Regular Expression là phương thức Match, Matches, IsMatch và cách chuyển đổi từ tập hợp Match sang kiểu dữ liệu Collection khác trong dotnet.

Phương thức Match()

Phương thức Match dùng để tách các chuỗi con từ chuỗi gốc ban đầu theo chuỗi mẫu partern đưa vào. Kết quả từ phương thứcMatch là tập hợp các chuỗi con thõa mãn điều kiện ban đầu. Trong ví dụ bên dưới ta thấy để truy xuất kết quả từ Match dùng thuộc tính match.Group[0].Value. 0 ở đây là thứ tự của truy vấn trong chuỗi partern, bắt đầu từ 0. Trong partern nếu có nhiều truy vấn lồng nhau thì giá trị 0 là thứ tự của các truy vấn con đó. (Tính thứ tự bắt đầu từ 0). Để chuyển sang kết quả tiếp theo ta dùng phương thức NextMatch().

re2

Phương thức Matches()

Tương tự với phương thức Match, Matches dùng để tách chuỗi theo chuỗi mẫu partern. Nhưng điều thú vị của Matches nằm ở kết quả trả về, cho ta biết được vị trí xuất hiện của chuỗi con. Tập hợp các kết quả từ Matches được trả về trong thuộc tính Captures, từ capture có thể lấy ra Index cho biết vị trí của chuỗi con và Value cho biết giá trị của chuỗi con. Trong ví dụ bên dưới từ chuỗi ban đầu ta dùng partern “s\w+d” để tách ra các chuỗi con theo mẫu bắt đầu là ký tự ‘s’ tiếp theo là có ít nhất 1 ký tự bất kỳ và cuối cùng là là ký tự ‘d’.

re3

Truy vấn lồng nhau trong chuỗi mẫu partern

Trong chuỗi partern có thể lồng nhiều truy vấn vấn khác nhau, khi truy xuất có thể tách kết quả theo Group. Ví dụ trong partern bên dưới ” ‘ (.*?)’ ” có 2 truy vấn lồng nhau, truy vấn đầu tiên là nguyên chuỗi partern, truy vấn thứ 2 trong ngoặc đơn. Khi lấy kết quả nếu ta dùng Group[0] thì tập hợp kết quả trả về là: ‘muzix’ ‘film’ ‘video’ và ‘hd’ (có dấu nháy đơn) Còn trường hợp bên dưới dùng Group[1] thì kết quả trả về là: muzix film video và hd (không có dấu nháy đơn). Như vậy việc lồng truy vấn trong partern sẽ giúp ta tiết kiệm truy vấn, thay ví dùng nhiều phương thức thì chỉ cần lồng truy vấn và tiến hành truy xuất thông qua Group.

re4

Phương thức IsMatch()

Phương thức này hỗ trợ kiểm tra xem một chuỗi con có tồn tại trong chuỗi ban đầu hay không. Đối số của phương thức tương tự với Match() và Matches() gồm: chuỗi ban đầu và partern mẫu cho truy vấn. Kết quả trả về là True hoặc False.

re5

Phương Thức Split() Trong Regular Expression Csharp

Đến với bài viết thứ tư về Regular Expression chúng ta sẽ tìm hiểu về phương thức Split() cũng như các đặc tính của phương thức này. Là một trong các hàm hỗ trợ của Regular Expression, Split() có chức năng chia/ tách văn bản ban đầu thành nhiều văn bản con dựa trên những điều kiện trong chuỗi mẫu partern. Để trích xuất nội dung từ 1 đoạn văn bản (nói chính xác là trích xuất từ trong văn bản) ta thường xem xét những ký tự xung quanh từ cần tách có những đặc điểm gì đáng chú ý để có thể dùng làm cơ sở chia tách; Ví dụ tách tất cả các từ thì đối tượng để tách là các khoảng trắng

Phương thức Split

Ví dụ bên dưới đầu tiên ta có 1 string mẫu vói nội dung là thứ tự các chuyên mục trong một website,; Vấn đề cần thực hiện là lấy chính xác tên của các chuyên mục. Ta thấy rằng giữa các chuyên mục được ngăn cách bởi chuỗi ” >> “. Đối số của Split() bao gồm: Chuỗi ban đầu và partern dùng để chia tách. Kết quả trả về là danh sách các chuỗi con thỏa mãn điều kiện của partern.

re6

Ví dụ tiếp theo về phương thức Split

Trong ví dụ thứ 2 này, giả sữ ban đầu ta có 1 string chứa tên các địa danh bên trong. Biết rằng tên địa danh viết theo chuẩn viết hoa chữ cái đầu tiên. Yêu cầu tách các tên riêng từ chuỗi ban đầu. Đầu tiên ta dùng partern “\W” để chia tách. “\W” để biểu thị cho các ký tự không không phải chữ cái, số và dấu gạch dưới. Như vây trong ví dụ này “\W” chính là các khoảng trắng. Như vậy ban đầu ta đã tách được tất cả các từ trong câu. Tiếp theo chỉ cần tách riêng các từ có ký đầu tiên viết hoa

re7

Phương Thức Replace Trong Regular Expression Csharp

Trong lần trước chúng ta đã đi qua bài giới thiệu căn bản đến tìm hiểu hoạt động của phương thức Match(); Đến với bài viết hôm nay ta sẽ tìm hiểu phương thức Replace() để thấy thêm được một phần sức mạnh của Regular Expression. Cái tên nói lên tất cả! Phương thức Replace() chủ yếu hoạt động cho các thao tác thay thế văn bản. Hầu hết được sử dụng để viết chức năng Find/Replace trong các chương trình xử lý văn bản như word, notepad…

Phương thức Replace()

Cấu trúc của phương thức Replace() rất đơn giản, chỉ gồm 3 đối số: Đầu tiên là string nguồn chính là văn bản cần xử lý, tiếp theo văn partern để quy định dạng văn bản mẫu để truy vấn trong văn bản nguồn và cuối cùng là văn bản dùng để thay thế. partern thì hoàn toàn tương tự như trong phương thức Match()/Matches() đã tìm hiểu trong bài viết trước. Kết quả trả về của phương thức là string sau khi được xử lý.

re8

Ví dụ về phương thức Replace()

Trong ví dụ bên dưới ta xây dựng một tool nhỏ với chức năng tìm kiếm để thay thế văn bản. Chương trình tự động hỗ trợ 2 dạng partern: Text thông thường hoặc là Regular Expression. Ví dụ, partern trong demo dùng để thay thế các tên bắt đầu bằng chữ cái “t” bằng các dấu “#”.

re21

Ứng dụng nhỏ về xử lý văn bản sử dụng phương thức Replace()

Nếu đã từng sử dụng Microsoft Office Word chắc bạn đã biết đến chức năng Change Case dùng để thay đổi các dạng văn bản. Trong Word hỗ trợ 4 dạng điều chỉnh sau:

    • UPPER CASE: Viết hoa tất cả các chữ cái
    • lower case: Viết thường tất cả các chữ cái
    • Title Case: Viết hoa chữ cái đầu tiên
    • tOGGLE cASE: Ngược lại với Title Case

Demo bên dưới cũng hỗ trợ 4 dạng xử lý như vừa kể trên. Ứng với mỗi dạng ta có thể xem code ở hình bên dưới.

re9

re10


1. Thủ Thuật CSharp


Nguồn http://microsofttech.net

Leave a comment