12/08/2018, 15:50

Tìm hiểu về xử lý chuỗi bằng Regex (phần cuối)

Trong phần cuối tìm hiểu về Regular Expression thì hôm nay thì mình xin giới thiệu tiếp những quy tắc còn lại trong Regular Expression. Các bạn có thể quay về phần trước để tham khảo thêm một số quy tắc mà mình đã đề cập đến: https://viblo.asia/p/tim-hieu-ve-xu-ly-chuoi-bang-regex-phan-ii-YWOZrMYRK ...

Trong phần cuối tìm hiểu về Regular Expression thì hôm nay thì mình xin giới thiệu tiếp những quy tắc còn lại trong Regular Expression. Các bạn có thể quay về phần trước để tham khảo thêm một số quy tắc mà mình đã đề cập đến: https://viblo.asia/p/tim-hieu-ve-xu-ly-chuoi-bang-regex-phan-ii-YWOZrMYRKQ0

1. Regex phủ định – NOT: Trong regex, ta dùng ký tự ^ để phủ định một Regex nào đó.

Ví dụ: Pattern: /[^0-9]{1,3}/gm Kết quả: Sẽ trả về chuỗi ký tự bất kỳ có chiều dài từ 1 đến 2 ký tự và không phải là ký tự số. Như kết quả bên dưới thì chuỗi chỉ match với ký tự chữ ( ký tự không nằm trong khoảng 0 ~ 9)

Ví dụ: Pattern: /[^a-zA-Z0-9]{1,3}/gm Kết quả: Sẽ trả về chuỗi ký tự bất kỳ có chiều dài từ 1 đến 3 ký tự và không phải là ký tự số và chữ. Như kết quả bên dưới thì chuỗi của chúng ta sẽ chấp nhận ký tự đặc biệt (ký tự không nằm trong khoảng 0 ~ 9 && a-z && A-Z)

2. Các ký tự regex đặc biệt: Regex cũng cấp cho chúng ta những cú pháp đơn giản hơn để có thể viết gọn một regex. Danh sách các ký tự Regex đặc biệt như sau:

  • d - Chữ số bất kỳ tương đương với pattern /^[0-9]$/
  • D - Ký tự bất kỳ không phải là chữ số (ngược với d) tương đương với pattern /^[^0-9]$/
  • w - Ký tự từ a-z, A-Z, hoặc 0-9 ~ tương đương với pattern /^[a-zA-Z0-9]$/
  • W - Ngược lại với w (nghĩa là các ký tự không thuộc các khoảng: a-z, A-Z, hoặc 0-9) tương đương với pattern /^[^a-zA-Z0-9]$/
  • s - Khoảng trắng (space)
  • S - Ký tự bất kỳ không phải là khoảng trắng.

3. Các ví dụ nâng cao về Regular Expression: Những ví dụ nâng cao này mục đích sẽ giúp các bạn hiểu rõ hơn về cách dùng regex. Đối với những lập trình viên bash/shell thì việc sử dụng regex để xử lý big data là việc rất quan trọng và thường xuyên. Và những ví dụ dưới đây theo mình thấy thì rất hay sử dụng:

  • Kiểm tra chuỗi phải là định dạng ngay/thang/nam: Pattern: /^[0-9]{2}/[0-9]{2}/[0-9]{4}$/gm Kết quả: Sẽ trả về chuỗi ký tự có định dạng dd/mm/yyyy Ở ví dụ dưới sẽ khớp với chuỗi 08/02/1992

  • Kiểm tra chuỗi phải là định dạng email: Pattern: ^[a-zA-Z0-9]*@[a-zA-Z0-9]*.[a-zA-Z0-9]*$/gm Kết quả: Sẽ trả về chuỗi ký tự có định dạng là email Ở ví dụ trên sẽ trã về chuỗi ngocvudoan8292@gmail.com

  • Kiểm tra chuỗi phải là định dạng địa chỉ MAC: Pattern: /^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/gm Kết quả: Sẽ trả về chuỗi ký tự có định dạng là Mac address

    Ở ví dụ trên sẽ trã về chuỗi 3D:F2:C9:A6:B3:4F

    Giải thích:

    Pattern /^([0-9A-Fa-f]{2}[:-]) sẽ tương đương với một chuỗi gồm 2 ký tự + ký tự ":". Và pattern {5} được thêm vào phía sau sẽ chỉ ra là chuỗi ký tự trên sẽ gồm 5 cặp như thế <<< sẽ match với kết quả ở trên là "3D:F2:C9:A6:B3:" Pattern ([0-9A-Fa-f]{2})$/ sẽ thể hiện phần còn lại của chuỗi mac address "4F"

Như vậy qua 3 phần mình đã giới thiệu cho các bạn biết về Regular expression bao gồm các pattern cơ bản cho đến nâng cao. Mình hy vọng thông qua bài viết sẽ giúp các developer có hướng tiếp cận dễ hơn với regex, sẽ không còn tình trạng ngồi phân tích một chuỗi regex dài tòng ngòng nữa. Mọi góp ý các bạn có thể comment cho mình dưới post này nhé!

0