8 regex ngắn hay dán mỗi ngày | Email, URL, trim, log — pocket card【2026】
Pocket card 8 pattern ngắn — đủ cho 80% việc hàng ngày: lọc số, trim, gộp space, email/URL lỏng, lấy chuỗi trong ngoặc, key=value trong log, và chữ Unicode cơ bản. Giữ ngắn có chủ đích: dễ đọc review, ít backtracking hơn “monster regex” Stack Overflow. Trước khi merge: 3 good / 3 bad trên Regex tester Kawa (chạy trình duyệt, không gửi server). Cần checklist ReDoS / fixture dày hơn → đọc bài pattern sâu riêng, không nhồi vào đây.
Developer fresher / freelancer Việt hay mở tab tìm “regex email hoàn hảo”, paste 200 ký tự vào form đăng ký, rồi tối debug vì [email protected] fail hoặc tab treo. Góc bài này khác: chỉ giữ pattern ngắn bạn thật sự dán lại mỗi tuần — như thẻ ghi chú cạnh màn hình, không phải encyclopedia.
Ai nên bookmark
- Người hay viết validate form nhanh, sanitize nhẹ, parse log staging
- Ai muốn nhớ ít pattern thay vì sưu tầm 50 biến thể
- Team outsourcing cần convention chung: “email chỉ lọc typo, không pretend RFC”
Nguyên tắc giữ ngắn
- Một việc một pattern — đừng vừa validate email vừa bắt TLD 50 ký tự
- Có neo
^$khi validate cả chuỗi; bỏ neo khi extract - 3 good / 3 bad cạnh pattern trong PR
- Không quantifier lồng kiểu
(a+)+trên input user - Ghi chú giới hạn trong comment:
// loose only
Bảng pocket — 8 pattern
| Việc | Pattern | Ghi chú một dòng |
|---|---|---|
| Chỉ chữ số | ^\d+$ | Tuổi, OTP thô; không dấu +/thập phân |
| Alnum ASCII | ^[a-zA-Z0-9]+$ | Username nội bộ; fail tên Việt có dấu |
| Email lỏng | ^[^\s@]+@[^\s@]+\.[^\s@]+$ | Có @ và dấu chấm; không RFC |
| URL http(s) | https?://[^\s]+ | Extract; có thể dính dấu câu cuối |
| Trim đầu/cuối | ^\s+|\s+$ | Replace → '' |
| Gộp khoảng trắng | \s+ | Replace → một space |
| Trong ngoặc kép | "([^"]*)" | Capture group 1 = nội dung |
| Log key=value | (\w+)=([^\s]+) | Flag g; value không có space |
Dưới đây mỗi mục: khi dùng / khi tránh / good / bad.
1. Chỉ chữ số — ^\d+$
Good: 0, 42, 2026
Bad: 3.14, +84, 1_000, ""
Phù hợp OTP đã tách riêng, mã số nội bộ. Không dùng cho tiền VND (có dấu chấm/phẩy) hay số điện thoại.
2. Alnum ASCII — ^[a-zA-Z0-9]+$
Good: user01, TeamA2
Bad: nguyễn, user_name, user-name
Username hệ thống cũ. Tên người Việt → fail ngay vì dấu và Đ/đ. Đừng dùng cho họ tên.
3. Email lỏng — ^[^\s@]+@[^\s@]+\.[^\s@]+$
Good: [email protected], [email protected]
Bad: a@b, a [email protected], @x.com
Chặn thiếu @ / thiếu dấu chấm domain. Không chứng minh mailbox tồn tại. Đăng ký thật: gửi mail xác nhận.
4. URL — https?://[^\s]+
Good: https://example.com/a?x=1
Bad: example.com (thiếu scheme), ftp://...
Extract từ log/chat. Cẩn thận dấu ) hoặc . cuối câu tiếng Việt dính vào match — trim tay hoặc siết class ký tự nếu cần.
5–6. Trim và gộp space
Replace ^\s+|\s+$ → rỗng; replace \s+ → một space. Dọn paste từ Slack/Zalo trước khi so sánh chuỗi hoặc đếm ký tự.
7. Chuỗi trong ngoặc kép — "([^"]*)"
Lấy config thô name="value". Không xử lý escape \" — nếu log có escape, chuyển parser.
8. Log key=value — (\w+)=([^\s]+) với flag g
Good: userId=42 status=ok
Bad: msg=hello world (value có space → cắt sớm)
Đủ để bóc requestId, status từ log một dòng. Value có space → đổi strategy (JSON log, hoặc pattern khác).
Bonus ngắn: chữ có dấu / Unicode
Nhiều bài JA liệt kê hiragana/katakana. Với developer Việt, nhu cầu gần hơn là không loại tên có dấu:
// JS có flag u — kiểm tra engine
const reLetter = /^\p{L}+$/u;
reLetter.test("Nguyễn"); // phụ thuộc engine + property escapes
Nếu môi trường không hỗ trợ \p{L}, đừng giả vờ [A-Za-z]+ đủ cho form họ tên — hãy không validate bằng regex chữ, chỉ trim độ dài và để user nhập Unicode.
Test tối thiểu: Nguyễn, Đặng, phở, Lê.
Case study 12 phút: form intern
Intern thêm validate username + email bằng hai monster regex copy web. QA fail:
| Input | Kỳ vọng | Kết quả monster |
|---|---|---|
an.nguyen | OK username | Fail (cấm dấu .) |
[email protected] | OK email | Fail |
chuỗi 5k chữ aaaa...! | Reject nhanh | Tab treo (backtracking) |
Sửa: username ^[a-zA-Z0-9._]{3,32}$; email lỏng như mục 3; độ dài max 254 trước khi test regex; unit test 3+3. Reviewer approve trong một vòng.
Quy trình test trên Kawa
- Mở Regex tester
- Dán pattern + bật đúng
g/i/m - Dán block text gồm good và bad xen kẽ
- Xác nhận highlight đúng chỗ; thử thêm chuỗi cực dài nếu pattern có
+/* - Copy pattern vào code — không chỉnh lại “cho đẹp” mà quên fixture
🔍 Kiểm tra mẫu regex ngay tại đây
Toàn bộ chạy trong trình duyệt — phù hợp log staging đã che PII, không dán lên regex101 công cộng nếu còn token.
Khi nào mở bài dài hơn (và khi nào dừng)
| Nhu cầu | Làm gì |
|---|---|
| Nhớ pattern dán hàng ngày | Bookmark bài này (pocket) |
| ReDoS, UUID, SĐT VN format, fixture dày | Bài regex pattern sâu / checklist ship |
| Parse HTML/CSV/email RFC | Không regex — parser / lib / OTP |
Giữ hai lớp tách biệt giúp onboard fresher: học ngắn trước, học cảnh báo sau — tránh một trang 40 pattern khiến không ai thuộc.
Checklist PR một dòng comment
// loose email — typo filter only; server sends confirm mail
- Pattern < ~40 ký tự hoặc có lý do rõ nếu dài hơn
- Có
^$đúng ý validate full-string - 3 good / 3 bad trong test
- Đã thử trên /vi/tools/regex/
- Không parse HTML/CSV bằng regex
- Comment ghi “loose” nếu là email/URL
Tóm tắt mang đi
- Tám pattern ngắn cover hầu hết việc validate/extract nhẹ
- Email/URL luôn “lỏng” — xác nhận thật ở lớp khác
- Tên Việt có dấu ≠
[A-Za-z]+ - Test local trước merge — mở Regex tester với đúng flag
Dán bảng pocket vào Notion team hoặc comment snippet nội bộ: lần sau không cần hỏi “regex email nào đúng?” — trả lời “bản lỏng + OTP”, xong việc.