Hầu hết các lập trình viên đều có một điểm mù. Họ có thể vui vẻ gỡ lỗi một hệ thống phân tán hoặc vật lộn với một framework mới, nhưng lại dành tới hai mươi phút để chỉnh sửa văn bản thủ công thay vì chỉ mất mười giây. Lý do luôn giống nhau: biểu thức chính quy (regular expressions) trông giống như những ký tự nhiễu. Một mẫu điển hình là một bức tường các dấu gạch chéo, dấu gạch chéo ngược và các dấu câu trông như thể được truyền qua một modem từ những năm 1990. Sự hỗn loạn về mặt thị giác đó khiến những người có năng lực e dè trước một kỹ năng thực sự giá trị.
Tin tốt là regex không hề khó. Nó chỉ là cô đọng. Các ký hiệu nén một lượng ý nghĩa khổng lồ vào một không gian nhỏ, vì vậy mắt bạn sẽ đọc thấy sự ngẫu nhiên trong khi thực tế đó là một mô tả rất chính xác. Một khi bạn có mô hình tư duy đúng đắn, bạn sẽ ngừng cố gắng giải mã từng ký hiệu một mà thay vào đó là đọc hình dáng mà chúng mô tả. Khi làm được như vậy, sự nhiễu loạn sẽ hoàn toàn biến mất.
Một Mẫu Hình, Không Phải Một Chương Trình
Sự thay đổi căn bản nằm ở việc hiểu bản chất thực sự của một biểu thức chính quy. Hầu hết mã bạn viết là theo trình tự: làm việc này, sau đó làm việc kia, kiểm tra điều kiện này, lặp lại. Regex không phải là một quy trình. Nó là một mẫu hình tĩnh mô tả văn bản nên trông như thế nào. Bạn không viết các chỉ dẫn về cách tìm kiếm; bạn đang đưa cho công cụ khớp (matching engine) một bản phác thảo và để nó tự thực hiện.
Hãy coi nó như việc mô tả các hình dáng bằng ngôn ngữ tự nhiên:
- Một số có năm chữ số.
- Một địa chỉ email.
- Một dòng bắt đầu bằng một chữ cái viết hoa.
Đó là tất cả những gì regex đang làm, ngoại trừ việc nó sử dụng một bảng chữ cái được nén lại. Khi bạn thấy \d{5}, bạn không thấy phép thuật. Bạn đang thấy "một chữ số, lặp lại năm lần". Khi bạn thấy ^[A-Z], bạn đang thấy "bắt đầu một dòng, theo sau là một chữ cái viết hoa". Kỹ năng ở đây không phải là học thuộc lòng. Đó là học cách liếc nhìn mẫu hình và dịch ngược nó trở lại thành mô tả bằng ngôn ngữ tự nhiên đó. Một khi bạn có thể thực hiện việc dịch thuật đó, cảm giác e dè sẽ biến mất.
Thời Gian Thực Sự Bị Lãng Phí Ở Đâu
Mọi người có xu hướng chỉ học regex sau khi đã chịu đựng đủ nhiều. Một cách tiếp cận tốt hơn là nhận ra những công việc đang rất cần một mẫu hình trước khi bạn lãng phí cả một buổi chiều cho chúng.
Nếu bạn cần tìm mọi ngày tháng trong một tài liệu dài hai trăm trang, regex sẽ định vị chúng chỉ trong một lần quét duy nhất. Nếu bạn cần xác thực xem người dùng có nhập một URL thật hay không trước khi ứng dụng của bạn chấp nhận nó, một mẫu hình có thể áp đặt hình dáng cơ bản của địa chỉ đó. Nếu bạn đang dọn dẹp văn bản sao chép từ một trang web và cần thu gọn nhiều khoảng trắng thành một khoảng trắng duy nhất, một regex thay thế chỉ mất bốn ký tự. Nếu bạn đang trích xuất dữ liệu từ các nhật ký máy chủ (server logs) lộn xộn, regex thường là cầu nối hợp lý duy nhất giữa văn bản không cấu trúc và một báo cáo có cấu trúc.
Đây là một quy tắc đơn giản để áp dụng: nếu bạn chuẩn bị thực hiện chỉnh sửa văn bản năm mươi lần bằng tay, hãy dừng lại. Thay vào đó, hãy viết một mẫu hình. Việc lặp lại thủ công không chỉ chậm chạp mà còn không đáng tin cậy. Bạn có thể bỏ lỡ lần thứ bốn mươi bảy hoặc mắc lỗi đánh máy ở lần thứ ba mươi ba. Một mẫu hình sẽ thực hiện công việc một lần, một cách chính xác, và nó đóng vai trò như tài liệu ghi lại quy tắc mà bạn đang áp dụng ngay từ đầu.
Một Vòng Lặp Học Tập Hiệu Quả
Đừng cố gắng gõ các mẫu hình hoàn hảo từ trí nhớ. Đó là cách mà sự ức chế nảy sinh. Thay vào đó, hãy tuân theo một vòng lặp chặt chẽ giúp bạn tiến về phía trước mà không bị lạc trong cú pháp.
- Mô tả hình dáng bằng lời nói. Trước khi bạn chạm vào bất kỳ ký tự đặc biệt nào, hãy viết ra chính xác những gì bạn muốn. "Bốn chữ số, theo sau là một dấu gạch ngang, tiếp theo là hai chữ số, tiếp theo là một dấu gạch ngang, và cuối cùng là hai chữ số." Nếu bạn không thể nói rõ ràng, bạn không thể tạo mẫu hình.
- Tạo bản nháp đầu tiên. Chuyển mô tả của bạn thành một mẫu hình cơ bản bằng cách sử dụng các ký hiệu rộng nhất có thể. Đừng lo lắng về sự hoàn hảo. Bạn đang xây dựng một bản mẫu,
