Lập trình 22/09/2026 5 phút

Lớp ký tự và quantifier: hai viên gạch nền, và cái bẫy \w không phải [a-zA-Z]

Lớp ký tự [...] và quantifier {m,n} là nền của mọi regex, nhưng chúng giấu vài cái bẫy. Bài này đo thật: trên 'Hoà', \w khớp cả chữ à (Unicode) còn [a-zA-Z] thì đứt ở à thành 'Ho'; và trên '1234567', {2,4} greedy lấy 4 trước rồi 3, còn {2,4}? lazy lấy 2 mỗi lần. Xem cả opcode MAX_REPEAT + IN RANGE mà engine biên dịch ra.

Lập trình 22/09/2026 6 phút

Unicode trong regex: vì sao \w cắt cụt chữ tiếng Việt và 'à' đôi khi không khớp

Regex và tiếng Việt là mỏ bug ít người lường trước. Bài này đo thật: python \w bắt 'chào' nguyên vẹn nhưng [a-zA-Z] cắt thành 'ch','o'; Go \w lại chỉ ASCII nên phải dùng \p{L}. Chữ 'à' có hai cách mã hóa (NFC 1 codepoint, NFD 2 codepoint) trông giống hệt mà regex khớp khác nhau. Và . khớp 1 rune chứ không phải 1 byte. Cách xử lý cho đúng.