Regex "vỡ lòng" cho người mới bắt đầu
Bài đăng này đã không được cập nhật trong 4 năm
Lời nói đầu
Xin chào tất cả các bạn, hôm nay mình sẽ quay trở lại với một chủ đề tuy lạ mà quen, tuy quen mà lạ
. Chắc hẳn nếu là một web developer, các bạn sẽ không còn xa lạ gì với việc phải validate dữ liệu người dùng nhập vào (email phải đúng format @xxx.xxx, tuổi/sđt phải không chứa ký tự chữ). Khi sử dụng các framework thì bạn có thể giải quyết nó một cách rất dễ dàng. Tuy nhiên bạn đã bao giờ tự hỏi là làm thế nào để xử lý được việc đó chưa?
Câu trả lời ở đây chính là "Regular Expressions- Biểu thức chính quy" hay thường được gọi tắt là Regex.
Nội dung
Regex là gì?
- Theo như định nghĩa trên wikipedia thì
Biểu thức chính quy (tiếng Anh: regular expression, viết tắt là regexp, regex hay regxp) là một chuỗi miêu tả một bộ các chuỗi khác, theo những quy tắc cú pháp nhất định. Biểu thức chính quy thường được dùng trong các trình biên tập văn bản và các tiện ích tìm kiếm và xử lý văn bản dựa trên các mẫu được quy định. Nhiều ngôn ngữ lập trình cũng hỗ trợ biểu thức chính quy trong việc xử lý chuỗi, chẳng hạn như Perl có bộ máy mạnh mẽ để xử lý biểu thức chính quy được xây dựng trực tiếp trong cú pháp của chúng. Bộ các trình tiện ích (gồm trình biên tập sed và trình lọc grep) đi kèm các bản phân phối Unix có vai trò đầu tiên trong việc phổ biến khái niệm biểu thức chính quy
-
Nói một cách đơn giản thì Regex là một bộ những quy tắc để xử lý chuỗi ký tự. Nó gần giống như kiểu là bạn tra từ điển vậy, bạn sẽ tìm ra một chuỗi ký tự thoả mãn điều kiện nhất định, và thay vì làm bằng cơm thì bạn sẽ dùng regex để nhờ máy tính tìm chuỗi ký tự ấy thay bạn.
-
Trước khi bắt đầu, hãy nhớ một điều rằng
Regex là BỘ QUY TẮC chứ không phải NGÔN NGỮ LẬP TRÌNH
. Và dù bạn có đang học tập, làm việc với ngôn ngữ lập trình nào đi chăng nữa thì nó cũng hỗ trợ regex, bởi vì nó cực kỳ phổ biến và hữu dụng.
Một số trang web phổ biến
-
Ngày xưa các cụ đã có câu "Học đi đôi với hành" cho nên là mình sẽ cung cấp cho các bạn các trang demo trước. Và ở trong mỗi trang cũng có phần cheatsheet thống kê các cú pháp của regex. Nếu bạn , còn nếu bạn lười dịch (như mình) thì hãy kéo xuống dưới xem phần vietsub của mình nhé.
-
Demo regex online:
-
Làm bài tập thực tế: https://regexone.com/
Các cú pháp thường sử dụng
[xyz]
tìm ra chuỗi có chứa 1 ký tự trong chuỗi ở trong dấu ngoặc vuông (hoặc x hoặc y hoặc z). Ví dụ:[ba]
sẽ trùng khớp với b hoặc a.
[X-Y]
tìm ra chuỗi có chứa 1 ký tự nằm trong khoảng chỉ định (có thể là chữ cái a-z hoặc chữ số 0-9). Ví dụ:[a-d]
sẽ trùng với a hoặc b hoặc c hoặc d.
[^xyz]
thêm dấu mũ vào trong[]
sẽ mang ý nghĩa phủ định, ở đây là tìm ra chuỗi KHÔNG chứa ký tự x và y và z.
\b
(viết thường) tìm chuỗi có chứa NGUYÊN VĂN ký tự đứng trước nó. Ví dụ: boy\b sẽ tìm ra chuỗi "boy friend" nhưng sẽ không tìm được chuỗi "boyfriend".
\B
(viết HOA) cái này sẽ ngược lại với\b
,\B
sẽ tìm chuỗi có chứa 1 phần ký tự đứng trước nó. Ví dụ: boy\B sẽ tìm ra chuỗi "boyfriend" nhưng sẽ không tìm được chuỗi "boy friend".
\d
(viết thường) tìm ra chuỗi có 1 ký tự số (digit).
\D
(viết HOA) ngược lại với\d
, tìm ra chuỗi 1 ký tự không phải số (non-digit).
\w
(viết thường) tìm chuỗi có chứa các ký tự là từ (word) bao gồm dấu _ (underscore) và chữ số.
\W
(viết HOA) ngược với\w
tìm chuỗi có chứa các ký tự đặc biệt (trừ dấu_
), không phải là từ. Ví dụ: \W sẽ khớp với ký tự % trong chuỗi "100%".
\s
(viết thường) tìm chuỗi có chứa 1 khoảng trắng (tab = 4 space thì cũng được tính là 1 khoảng trắng)
\S
(viết HOA) tìm chuỗi có chứa 1 ký tự không phải là khoảng trắng (non-whitespace).
^x
dấu mũ khi không đặt trong [] sẽ tìm ra ký tự/chuỗi ký tự đứng đầu tiên trong 1 chuỗi. Ví dụ:^a
sẽ tìm ra ký tự a đứng đầu trong chuỗi, tức là chuỗi "abc" thì tìm được nhưng chuỗi "bac". "bca" thì không,
x$
ngược với^
, nó sẽ tìm ra ký tự/chuỗi ký tự đứng cuối trong 1 chuỗi. Ví dụ:a$
sẽ tìm ra ký tự a đứng cuối trong chuỗi, tức là chuỗi "bca" thì tìm được nhưng chuỗi "bac". "abc" thì không,
+
tìm ra chuỗi có chứa 1 hoặc nhiều ký tự liên tiếp. Ví dụa+
sẽ tìm được chuỗi có 1 chữ a hoặc nhiều chữ a liền nhau.
?
(thực sự là mình không biết phải giải thích bằng lời thế nào nên các bạn xem tạm ví dụ để hiểu nhé). Ví dụ;abc?
sẽ tìm ra chuỗi "ab", "abc" nhưng lại không tìm ra chuỗi "abbbbb" hay "abcccccccc"
*
giống như?
tuy nhiên ký tự cuối có thể xuất hiện nhiều lần. Ví dụabc*
sẽ tìm ra chuỗi có chứa "ab", "abc", "abccccccc" nhưng lại ko tìm được "a" hay "bc".
.
tìm thấy tất cả các ký tự đơn bất kỳ trừ ký tự ngắt dòng (line-break).
x{n}
tìm được chuỗi x lặp lại n lần (n > 0). Ví dụa{3}
sẽ tìm chuỗi có đúng 3 chữ a liền nhau.
x{n,}
tìm được chuỗi x lặp lại ít nhất n lần (n > 0). Ví dụa{3,}
sẽ tìm chuỗi có ít nhất 3 chữ a liền nhau.
x{n,m}
tìm được chuỗi x lặp lại từ n đến m lần (0 < n < m). Ví dụa{3,5}
sẽ tìm chuỗi có chứa từ 3 đến 5 chữ a liền nhau.
x|y
tìm chuỗi có chưa x hoặc y.
Trên đây là những cú pháp cơ bản giống như là bảng chữ cái khi học một ngoại ngữ vậy, để ghép thành từ bạn sẽ phải kết hợp các chữ cái với nhau. Thế nên là trong thực tế bạn sẽ phải kết hợp vài, hoặc nhiều cú pháp ở trên để có thể tìm được chuỗi mà bạn mong muốn. Nghe có vẻ khó rồi đúng không? Nhưng mà khó thì mới hấp dẫn chứ!
Cái gì dễ dàng đạt được quá thì sẽ không biết trân trọng.
Tổng kết
- Mong rằng sau bài viết này các bạn sẽ nắm được các cú pháp cơ bản của regex, bởi vì bài hôm nay chỉ mới là bài VỠ LÒNG thôi. Mình biết là mới đầu sẽ khá là khó nhưng chẳng có thành công nào có thể đạt được chỉ trong ngày một ngày hai cả, vì vậy đừng vội nản nhé,
CẦN CÙ BÙ SIÊNG NĂNG
mà
Tài liệu tham khảo
All rights reserved