Tìm hiểu về Regex phần 1

Giới thiệu

Regex hay còn gọi là Regular Expressions, được sử dụng nhiều trong các trường hợp validate email, input, ... Regex được tạo thành từ các ký tự số 0-9, các chữ cái, ký tự đặc biệt trên bàn phím như %#$$!. Sau đây là một số định dạng của regex dành cho

(?<=\s|^)\d+(?=\s|$)
^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$

Để kiểm tra mình viết Regex có đúng hay không, các bạn có thể vào link sau: http://rubular.com/

Các cú pháp cơ bản của Regex

Sau đây là danh sách các cú pháp cơ bản của Regex, chúng ta sẽ đi lần lượt từng mục thông qua các ví dụ:

  1. abc... : Chữ
  2. 123... : Số
  3. /d: Bất cứ số nào
  4. /D : Gì cũng được trừ số ra
  5. . : Bất cứ ký tự nào.
  6. [abc] : Chỉ có a, b hoặc c
  7. [^abc] : Không được có a, b, c
  8. [0-9] : Số từ 0 -> 9
  9. \w: Bất cứ ký tự chữ nào.
  10. \W: Gì cũng được trừ chữ ra.
  11. {m}: Lặp lại m lần.
  12. {m, n} : Lặp lại tối thiểu m lần, tối đa n lần.
  13. * : Có thể không có hoặc nhiều lần. (Không giới hạn số lần)
  14. + : Tối thiểu phải xuất hiện 1 lần.
  15. ? : Có xuất hiện cũng được, không cũng được.
  16. \s : Dấu cách (space).
  17. \S: Gì cũng được trừ dấu cách ra (space).
  18. ^..$: Quy định bắt đầu và kết thúc của một chuỗi.
  19. (...): Nhóm các ký tự lại.
  20. (a|b) : Một trong hai a hoặc b.

Ví dụ về abc

Hãy viết Regex để validate một chuỗi chỉ có 3 chữ 'abc'. Cụ thể như sau:
- Hợp lệ: abc.
- Không hợp lệ:
    + a
    + b
    + ab
    + abcd
    + abc123

Dựa trên các cú pháp cơ bản đã nêu, chúng ta có thể suy nghĩ ra các đáp án như sau:

abc
abc...

Chúng ta sẽ tiến hành kiểm tra "abc" có đúng hay không bằng cách sử dụng http://rubular.com/ như hình dưới: Trong rubulax, những chuỗi test của bạn được bôi màu thì sẽ được gọi là hợp lệ, nhưng yêu cầu của chúng ta là kết quả chỉ bao gồm các ký tự abc thôi nên cú pháp "abc" là không hợp lệ. Do đó, đáp án chính xác sẽ là ^abc$. Lúc này kết quả sẽ khớp với yêu cầu đã đặt ra: Giải thích

- abc : Validate string có một chuỗi là abc
- ^ac$ : Validate string có ký tự bắt đầu bằng a và kết thúc bằng ký tự c. 
Do đó:
^abc$ : Validate string có một chuỗi là abc, trong đó ký tự bắt đầu là a, ký tự kết thúc là c.

Ví dụ về 123

Hãy viết Regex để validate một chuỗi chỉ có 3 chữ số '123'. Cụ thể như sau:
- Hợp lệ: abc.
- Không hợp lệ:
    + 1
    + 2
    + 12
    + 1234
    + 123abc

Tương tự với mục ở trên, chúng ta có được kết quả:

^123$ # Validate một chuỗi bao gồm 123 và bắt đầu từ 1 và kết thúc từ 3

Ví dụ về \d

Hãy viết Regex để validate một chuỗi chỉ có ký tự là số. Cụ thể như sau:
- Hợp lệ:
    + 1
    + 2
    + 3
    + 123
- Không hợp lệ:
    + 123!@#$
    + abc
    + 123abc

Dựa trên các ví dụ đã học được, ta có thể đoán ra cú pháp ^\d$ là kết quả đúng. Kiểm tra thử kết quả này trên rubular: Ta thấy kết qua 123 vẫn không được bôi xanh, do đó cú pháp ^\d$ là không chính xác. Bởi vì:

^\d$ # Hãy validate một string có một ký tự là số duy nhất và ký tự bắt đầu, kết thúc cũng là số đó.

Như vậy, ta cần phải bổ sung cú pháp sau vào regex của mình: * hoặc + Lúc này cú pháp của ta là:

^\d+$ ; # Hãy validate string chỉ toàn ký tự số, dấu + mô tả chuỗi này phải có ít nhất 1 chữ số trở lên.
^\d*$ ; # Hãy validate string chỉ toàn ký tự số, dấu * mô tả chuỗi này phải có ít nhất 0 chữ số trở lên.

Khi chúng ta thử cú pháp ^\d*$ thì vẫn thấy kết quả đúng, tuy nhiên ta nên sử dụng cú pháp ^\d+$ cho chính xác hơn. (Định nghĩa về * và + đã được mô tả ở đầu bài viết).

Ví dụ về \D

Hãy viết Regex để validate một chuỗi bắt buộc không chưa ký tự là số. Cụ thể như sau:
- Hợp lệ:
    + ~!@#$
    + abc
    + abc~!@#
    + a~!@#
    + ab~!@#
- Không hợp lệ:
    + 1
    + 2
    + ab123

Tương tự ví dụ trên, ta sẽ sử dụng \D để mô tả regex này, chúng ta dễ dàng suy ra được kết quả cuối cùng của yêu cầu trên là: ^\D+$. Kiểm tra cú pháp trong Rubular:

Tổng kết

Như vậy chúng ta đã đi qua được 4 ví dụ cơ bản để làm quen với Regex như sau:

^ .. $ : Sử dụng trong trường hợp cần xác định ký tự bắt đầu và kết thúc.
\d : Sử dụng trong trường hợp cần xác định 1 ký tự là số.
\D : Sử dụng trong trường hợp cần xác định 1 ký tự không phải là số.
+ : 1 hoặc n. 
VD: ^ab\d+$ ; # ab1, abc2, ab123, là hợp lệ. Còn ab, abc, ... là không hợp lệ
* : 0 hoặc n.
VD: ^ab\d*$; # ab, abc, ab1, abc2, ab123 đều là hợp lệ.

Ở phần tiếp theo chúng ta sẽ tiếp tục đi những cú pháp cơ bản đã nêu ở phần giới thiệu. Cảm ơn các bạn đã theo dõi!