2024.04.22

Regex là cái chi chi? Nó hoạt động ra sao?

Tìm hiểu về cách thức hoạt động của biểu thức chính quy(Regex).

Regex hoạt động thế nào?

Regex là gì? Lợi ích của nó?

regex là gì?

Regex giúp ta thay đổi định dạng số điện thoại, tìm kiếm từ trong văn bản, xác định định dạng đầu vào cho các ô nhập thông tin, trích xuất thông tin và nhiều thứ khác nữa.

Regex hoặc RegExp là viết tắt của Regular Expression (Biểu thức chính quy). Đơn thuần nó là một chuỗi các ký tự mô tả những gì ta muốn tìm kiếm hay muốn trích xuất. Nhưng với chuỗi ký tự này thì không thể nào tạo nên điều đặc biệt, mà phải có một công cụ để thực thi, người gọi đó là “Regular Expression engine”. Cú pháp và hành vi xử lý của một Regular Expression engine được gọi là “Regular expression flavor”. Với mỗi ngôn ngữ lập trình, regular expression flavor sẽ có đôi chút khác nhau nhưng không nhiều lắm.

Cần những gì để có thể sử dụng được Regex?

Trước tiên phải nắm rõ cách thức mà nó hoạt động, sau đó là cú pháp. Vì vậy, trong bài viết này mình sẽ tìm hiểu sơ lược cách một Regex Engine hoạt động thông qua các ví dụ.

Ví dụ tìm kiếm một từ trong đoạn văn:

Trước khi đi vào ví dụ cụ thể, chúng ta sẽ có một vài quy ước để tránh gây nhầm lẫn khi giải thích ví dụ.

  • Chuỗi regex sẽ có nền màu xanh lá abcde.
  • Đoạn văn mẫu có nền màu vàng abcde.

Vào ví dụ nào.

Ex1: Tìm kiếm Cat trong đoạn văn sau: Cats are animals.

Khi Regex engine bắt đầu thực thi, nó sẽ bắt đầu tại ký tự đầu tiên của chuỗi regex (C), với ký tự đầu tiên trong đoạn văn (C), “C” khớp với “C”. 

Tiếp tục lấy ký tự thứ hai trong (a) so với ký tự thứ hai trong đoạn văn (a), vì “a” khớp với “a”, nên lấy (t) so sánh với (t) trong đoạn văn. Vậy là đã tìm được Cat trong đoạn văn, Regex engine sẽ dừng lại tại đây(*).

Ex2: Tìm kiếm cat trong đoạn văn sau: cars are not animals but cats are.

Vẫn như ở ví dụ một, Regex engine bắt đầu với ký tự đầu tiên (c) so sánh với ký tự đầu tiên trong đoạn văn (c), “c” khớp với “c”.

Tiếp tục với ký tự thứ hai trong (a) so với ký tự thứ hai trong đoạn văn (a), “a” khớp với “a”.

Đến ký tự thứ 3 (t) kết quả là không khớp với (r) trong đoạn văn. Vì vậy, tại bước kế tiếp Regex engine quay lại ký tự đầu tiên trong (c) so sánh với ký tự thứ hai trong đoạn văn (a), “c” không khớp với “a”.

Đến ký tự thứ 3 (t) kết quả là không khớp với (r) trong đoạn văn. Vì vậy, tại bước kế tiếp Regex engine quay lại ký tự đầu tiên trong (c) so sánh với ký tự thứ hai trong đoạn văn (a), “c” không khớp với “a”. 

Lại lấy (c) so sánh với (r) kết quả không khớp nhau. Và tiếp tục như thế so sánh ký tự (c) với từng ký tự tiếp theo trong đoạn văn, cho đến khi (c) khớp với ký tự (c) tại vị trí 26 trong đoạn văn. Sau khi “c” trùng khớp với “c”, sau đó ta lấy (a) so sánh với (a) tại vị trí thứ 27, “a” khớp với “a”. Regex engine so tiếp (t) với (t), “t” khớp với “t”. Vậy là ta đã tìm được “cat” trong đoạn văn. Đến đây, Regex engine dừng tìm kiếm(*).

Chú ý: 

  • (*) Giả sử vẫn còn từ “Cat” hoặc “cat” khác trong đoạn văn trên bạn muốn tìm kiếm tiếp những “Cat” hoặc “cat” còn lại thì ta sẽ tìm hiểu trong bài viết liên quan đến Regex modifiers.
  • Trong ví dụ Ex2, lần so sánh thứ 3 (so sánh (t) và (r)), kết quả của lần này không khớp với nhau. Vì thế, Regex engine quay lại ký tự đầu tiên trong (c) so sánh với ký tự thứ hai trong đoạn văn (a), thì ở quá trình quay lại này người ta gọi là backtracking.
  • Khoảng trống vẫn được so sánh trong hai ví dụ trên.

Với hai ví dụ trên chắc phần nào bạn đã hình dung cách hoạt động ra sao? Trong những bài tiếp theo ta sẽ cùng tìm hiểu về những cú pháp cơ bản sử dụng trong Regex. 

Cảm ơn bạn đã đọc bài viết của mình, rất mong những phản hồi từ các bạn (nếu có) để cùng nhau hiểu hơn về Regular Expression (Biểu thức chính quy).

Nguồn tham khảo: https://www.regular-expressions.info/engine.html

Ngoài ra, còn nhiều bài viết kỹ thuật từ MEVN blogs mời các bạn tìm đọc.

0 Comments
Inline Feedbacks
View all comments