2024.06.17

Literal Characters, Special Characters trong 1 regex pattern

Literal characters, special characters, character classes là gì?

Trong bài viết trước, mình đã giới thiệu sơ lượt về cách Regex engine hoạt động. Ở bài viết này sẽ tiếp tục tìm hiểu về một vài định nghĩa cơ bản sử trong Regular Expression như là Literal Characters, Special Characters, Character Classes.

1. Literal Characters

Literal characters bao gồm:

  • Chữ cái (alphabet):

    • Viết thường : a b c d e f g h i k l m n o p q r s t u v w x y z
    • Viết hoa: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
  • Chữ số: từ 0 đến 9.

  • Các dấu dùng trong câu (punctuation marks):  , “ ‘ ( ) { } / \ ? ! . [ ] vân vân.

  • Khoảng trắng (whitespace character).

Với những chuỗi regex (regex pattern) đơn giản, có thể sử dụng Literal characters để tạo ra một regex pattern, nhưng với các yêu cầu phức tạp hơn, hãy cùng tìm hiểu những phần tiếp theo.

2. Special Characters

Cần chú ý khi sử dụng các Literal characters là các dấu câu (punctuation marks), vì có thể một trong số chúng là ký tự đặc biệt: . ^ $ * + ? [ | ( ) { \ [. Những ký tự đặc biệt này được gọi là metacharacters. Muốn sử dụng những metacharacters này như một ký tự thông thường (Literal characters), phải thêm dấu \ (backslash) vào trước chúng. 

Special Characters vs Literal Characters
Hình 1: Special Characters vs Literal Characters
  1. . – Dot (chấm)
  2. ^ – Caret (mũ)
  3. $ – Dollar (đô la)
  4. * – Asterisk (dấu hoa thị)
  5. + – Plus (dấu cộng)
  6. ? – Question mark (dấu hỏi)
  7. [ – Square brackets (ngoặc vuông)
  8. | – Pipe (ống)
  9. ( – Parentheses (ngoặc đơn)
  10. ) – Parentheses (ngoặc đơn)
  11. { – Curly braces (ngoặc nhọn)
  12. \ – Backslash (dấu gạch chéo ngược)

Link tham khảo: Special Characters

Trong bài này chỉ khái quát, sơ lượt về các ký tự đặc biệt này, mình sẽ giải thích chi tiết chức năng của từng loại trong những bài viết tiếp theo.

Ex: Ta có một regex pattern 1+1=2

Muốn so sánh với 1+1=2 thì ta phải viết regex pattern là 1\+1=2 vì dấu cộng (+) là một trong những ký tự đặc biệt.

Bạn có thể kiểm tra tại link sau: https://regex101.com/r/rFU0zS/1

3. Character Classes

Ex 1: Cần tìm kiếm một chữ cái thường trong chuỗi a123456. Lúc này regex pattern của chúng ta sẽ như sau: a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|v|z

Có phải là chuỗi regex quá dài không? Để ngắn gọn ta viết ngắn gọn là [a-z]. [a-z] là một Character Class.

Link chạy thử regex https://regex101.com/r/TVGZ4P/1

Character Classes hay còn gọi là “character set”. Đại diện cho các nhóm ký tự có tính chất chung như chữ cái, chữ số, dấu câu, hoặc các ký tự đặc biệt.

Dưới đây là một số cú pháp phổ biến của các “Character Sets”:

  • [abc]: Khớp với bất kỳ ký tự nào trong tập hợp {a, b, c}.
  • [a-z]: Khớp với bất kỳ ký tự nào từ “a” đến “z”.
  • [A-Z]: Khớp với bất kỳ ký tự nào từ “A” đến “Z”.
  • [0-9]: Khớp với bất kỳ chữ số nào từ 0 đến 9.
  • [a-zA-Z]: Khớp với bất kỳ chữ cái nào (cả chữ cái viết hoa và viết thường).
  • [a-zA-Z0-9]: Khớp với bất kỳ chữ cái hoặc chữ số nào.

Ex 2: Cần tìm kiếm một chữ cái thường trong chuỗi g123456. Thử với character set: [a-z]

Link chạy thử regex https://regex101.com/r/iFv0N9/1

Dưới đây là một số “shorthand Character Classes” phổ biến:

  • \d: Được sử dụng để khớp với bất kỳ chữ số nào từ 0 đến 9.
  • \D: Khớp với bất kỳ ký tự nào không phải là chữ số.
  • \w: Khớp với bất kỳ ký tự nào là chữ cái, chữ số hoặc dấu gạch dưới.
  • \W: Khớp với bất kỳ ký tự nào không phải là chữ cái, chữ số hoặc dấu gạch dưới.
  • \s: Khớp với ký tự khoảng trắng (space).
  • \S: Khớp với bất kỳ ký tự nào không phải là khoảng trắng.

Ex 3: Cần tìm kiếm ký tự không phải là chữ cái, chữ số hoặc dấu gạch dưới  g 1_2A2@33%4. Thử với character set: \W

Link chạy thử regex: https://regex101.com/r/ri8fOV/3

4. Ví dụ về cách sử dụng Literal Characters, Special Characters và Character Classes.

Kiểm tra xem email người dùng nhập vào đúng với định dạng mong muốn không:

<tên email dài từ 3 đến 20 ký tự>@gmail.com

Ta có chuỗi regex: ^[a-zA-Z_0-9]+@gmail.com$

Bạn hãy chạy thử link bên dưới:

https://regex101.com/r/21mp3g/2

Có phải đoạn text nhập vào là một email đúng như mô tả không. Tiếp theo, hãy chạy link sau:

https://regex101.com/r/h2PFRh/1

Kết quả là email nhập vào không khớp với yêu cầu không? Nguyên nhân do {3,20} yêu cầu tên email phải có độ dài từ ít nhất là 3, và nhiều nhất là 20 ký tự.

Thử bỏ ^ và $ trong chuỗi pattern, sửa lại email thêm % vào cuối https://regex101.com/r/MITWpx/1 ta vẫn tìm thấy email đúng định dạng có phải không, nhưng bạn thấy dư “%” không. Vậy thì chuỗi này không hợp với yêu cầu ban đầu.

Bạn có thấy rằng pattern của chúng ta có sử dụng các ký tự đặc biệt là: ^ (Caret (mũ)), (Dollar (đô la)), {3,20}. Ta sẽ nói kỹ hơn cách hoạt động của chúng trong bài viết sau.

Để xem các patterns hoạt động như thế nào, mở link regex101 đính kèm, nhấn Regex Debugger góc trái bên dưới màn hình, nhấn vào các dấu mũi tên xem và hiểu hơn cách regex engine hoạt động.

Regex Debugger

Hình 2: Regex Debugger

Cảm ơn các bạn đã dành thời gian đọc bài viết.

Nguồn tham khảo: 

https://www.regular-expressions.info/characters.html

https://www.regular-expressions.info/shorthand.html

https://www.regular-expressions.info/charclass.html

Subscribe
Notify of
0 Comments
Inline Feedbacks
View all comments