Title Image

Blog Logo

🌱 Regex - Regular Expression

🌱 Regex - Regular Expression

    Regex - Một khái niệm có vẻ không liên quan đến nhúng cho lắm, nhưng lại rất quen thuộc đối với những ngôn ngữ lập trình bậc cao, và ngoài ra nó còn là một công cụ hỗ trợ đắc lực trong các phần mềm lập trình. Vì vậy, đã là người làm việc liên quan đến Software, chúng ta nên biết về khái niệm này!

    👉 Regex là gì?

    Regex - Viết tắt của Regular Expression, tiếng việt gọi là 'biểu thức chính quy', là một chuỗi các ký tự đặc biệt được định nghĩa để tạo nên các mẫu các mẫu (pattern) thay vì các chuỗi cụ thể. Chúng được sử dụng để phân tích cú pháp, tìm kiếm, thay thế trong các chuỗi và đoạn ký tự.

    Regex sẽ được dùng trong hầu hết các ngôn ngữ lập trình hiện nay. Đây được xem là một công cụ đắc lực và vô cùng mạnh mẽ dùng để phân tích, validate dữ liệu đầu vào. Trong các Text Editor thông dụng như Nodepad++, Subline Text, VSCode cũng đều sử dụng Regex trong tool tìm kiếm của mình.

    Điểm hạn chế lại là mỗi ngôn ngữ lại được hỗ trợ với biểu thức cách khác nhau. Vì vậy, khi làm việc với Regex, chúng ta cần nắm được những nguyên tắc chung, và khi làm việc với từng ngôn ngữ khác nhau thì chúng ta sẽ đi tìm cú pháp của từng ngôn ngữ đó.

    ➥ Đối với Blog Lập trình - Điện tử, các bạn có thể tiếp cận với ngôn ngữ lập trình Python.

    👉 Một số Regex cơ bản

    Các bạn có thể tham khảo bảng sau về một số cú pháp Regex cơ bản

Regex Symbols

Regex String

    Nhìn chung, có rất nhiều cú pháp, ký hiệu của Regex, và chắc hẳn chúng ta sẽ không thể nhớ hết được chúng dùng để làm gì. Vì vậy, cách học Regex tốt nhất là làm các ví dụ, bài toán cụ thể, để biết được trường hợp cụ thể thì cần dùng cú pháp nào. 

    Dưới đây mình có một vài ví dụ và cách sử dụng Regex. Mình sẽ lấy ví dụ bằng ngôn ngữ Python.

    👉 Ví dụ sử dụng Regex trong Text Editor - Notepad++

Regex Example

    Ở ví dụ này đơn giản mình có một Text input đầu vào gồm rất nhiều thành phần có cùng một format (Giả sử có hàng trăm, hàng nghìn thành phần như vậy nên chúng ta không thể thao tác bằng tay). Và chúng ta mong muốn đầu ra ở dạng Text output, tức là các định dạng
    Tên Core + dấu trừ (-) hoặc dấu chia (/) + Core Number , sẽ thành output có dạng
    Tên core + dấu chấm + Core Number.

    Rõ ràng theo format trên thì chúng ta không được phép replace toàn bộ dấu trừ và dấu chia thành dấu chấm (bằng tính năng Replace All của Notepad++), vì ở những vị trí khác hoàn toàn có thể chứa 2 dấu này, nhưng lại không cần thay thế. 

    Ở đây, các bạn hãy thử tham khảo cách làm sử dụng Regex, follow theo các bước sau đây mà mình thường làm:

    💬 Bước 1. Tạo ra Pattern

    Pattern - là chuỗi các ký tự đặc biệt, được sử dụng để đại diện cho các chuỗi cụ thể có cấu trúc giống nhau. Ở trên mình đã có được cấu trúc rồi, đó là:

Tên Core + dấu trừ (-) hoặc dấu chia (/) + Core Number

    Vậy hãy biến nó thành một Pattern cụ thể dưới dạng Regex.

    Để ý một chút thì Tên Core sẽ là một trong các dạng (M7, A53, R52, ...) Tức là có dạng một vài ký tự liền nhau. Xét bảng trên, đối với dạng ký tự, chúng ta có thể dùng \w để thay thế, còn đối với dạng nhiều ký tự (One or More), chúng ta sẽ thêm dấu cộng (+).

  • Tức là Tên Core sẽ được biểu diễn chung bằng pattern \w+
  • Tiếp theo là dấu trừ và dấu chia, chỉ có một trong hai dấu xuất hiện, tức là phép hoặc, chúng ta có thể dùng dấu or để đại diện => pattern -|/
  • Core Number thì đơn giản là một số decimal => Pattern \d hoặc \d+ nếu có 2 chữ số trở lên.

    👉 Tổng hợp lại chúng ta có pattern:     \w+-|/\d

    Tất nhiên là sẽ cần thêm dấu đóng/mở ngoặc để tránh việc dấu or sẽ gây hiểu nhầm thành or giữa 2 pattern     =>     \w+(-|/)\d

    💬 Bước 2. Tìm kiếm và kiểm chứng Pattern trong chuỗi cần xử lý

Đối với Notepad++, chúng ta bấm Ctrl + F để mở cửa sổ tìm kiếm. Tick chọn vào phần Regular Expression như hình và tìm kiếm pattern trên.

Regex Example

    💬 Bước 3. Tạo ra các Group để xử lý, trích xuất, thay thế data

    Đối với Regex, chúng ta có thể chia nhỏ data thành các group data để xử lý data một các đơn giản hơn. Việc này có thể được thực hiện đơn giản bằng cách thêm vào các dấu ngoặc tròn. 

    Nếu pattern của chúng ta được tìm thấy trong chuỗi, chúng sẽ mặc định coi toàn bộ pattern tìm thấy là Group 0. Nếu trong pattern có các dấu mở/đóng ngoặc tròn, thì các dấu mở ngoặc xuất hiện lần lượt sẽ là các Group tiếp theo (Group 1, Group 2, ...).

    Với bài toán trên thì mục tiêu của chúng ta là thay thế dấu trừ hoặc dấu bằng bởi dấu chấm. Hai thành phần là Tên Core và Core Number sẽ được giữ lại đúng với giá trị ban đầu. Vì vậy, chúng ta có thể tạo 2 Group riêng cho 2 phần này, và chỉ thay thế phần còn lại (dấu trừ hoặc dấu chia).

    👉 Pattern mới sẽ là : (\w+)(-|/)(\d)

    Với Pattern này thì chúng ta sẽ tìm thấy 4 Group:

  • Group 0 : Toàn bộ chuỗi pattern (ví dụ M7-0)
  • Group 1 : \w+ (ví dụ M7)
  • Group 2 : -|/ (ví dụ dấu -)
  • Group 3 : \d (ví dụ 0)

    Để gọi lại giá trị của một Group dưới dạng Regex, Notepad++ hỗ trợ chúng ta cú pháp \Group number. Ví dụ gọi Group 1 bằng cách \1

    Công việc cần làm là thay thế Group 2 bởi dấu chấm. Chúng ta có thể sử dụng tính năng Replace All của Notepad++. Thay thế toàn bộ Pattern cũ bằng Pattern mới như sau (Group 1 + Dấu chấm + Group 3) :    \1.\3

Regex Group Example

    ➥ Và công việc đã xong rất đơn giản với Regex!!!

    👉 Ví dụ sử dụng Regex với Python

    Đối với ngôn ngữ lập trình thì việc chúng ta cần làm cũng tương tự các bước như trên. Ở đây mình lấy ví dụ với Python.

    💬 Bước 1. Tạo ra Pattern (Group) và compile Pattern

    Python hỗ trợ chúng ta thư viện re để sử dụng cho Regex. Sau khi tạo ra Pattern dạng chuỗi, chúng ta cần compile nó để tạo ra một Pattern Object, sử dụng cho các hàm tìm kiếm của Regex. 

Regex Pattern Group

    💬 Bước 2. Tìm kiếm Pattern Object trong chuỗi Text 

    Python hỗ trợ 2 hàm tìm kiếm chính là search()findall(). Với search() dùng để tìm kiếm sự xuất hiện đầu tiên của Pattern Object trong Text. Còn findall() dùng để tìm kiếm toàn bộ sự xuất hiện đó.

    Lưu ý nếu không tìm thấy kết quả, 2 hàm này đều trả về None.

Regex Pattern Object

    💬 Bước 3. Quản lý chuỗi qua các Group 

Regex group example

    Dễ thấy các Group được quản lý giống như trước hợp Notepad++ ở trên đã phân tích. Và chúng ta có thể dễ dàng thay thế Text bằng các hàm như replace().

    Trên đây là những chia sẻ ngắn gọn nhất để các bạn có thể hiểu hơn về Regex, cũng như cách sử dụng Regex trong thực tế. Còn rất nhiều thứ phải học và thực hành ở phía trước để chúng ta có thể thành thạo được công cụ hữu ích này!!!

>>>= Follow ngay =<<<

💚 Kênh Youtube Lập trình - Điện tử 💚

Để nhận được những bài học miễn phí mới nhất nhé 😊

    Chúc các bạn học tập tốt 😊

Đăng nhận xét

0 Nhận xét