AILapTrinh.comAI Lập Trình
Giao việc cho AI và câu lệnh mẫu

Viết regex bằng AI: mô tả mẫu, đưa ví dụ khớp và không khớp, thử trước khi dùng

Cách nhờ AI viết biểu thức chính quy đúng ý: nêu ngôn ngữ chạy, đưa cả ví dụ phải khớp lẫn phải trượt, bắt giải thích từng phần và tránh mẫu treo máy.

Over-the-shoulder view of a developer at night in a Can Tho rented room, desk lamp on, laptop screen blank and dim, small notebook with blank pages, ceiling fan above

Biểu thức chính quy là loại việc AI viết nhanh nhưng người đọc khó kiểm nhất, nên câu lệnh tốt phải có ba thứ: ngôn ngữ và hàm sẽ chạy biểu thức, danh sách chuỗi phải khớp, và danh sách chuỗi phải không khớp. Có hai danh sách đó, bạn kiểm biểu thức bằng cách chạy chứ không phải bằng cách đọc, và trợ lý cũng có đặc tả rõ để nhắm tới.

Bài này đưa mẫu câu lệnh, cách yêu cầu trợ lý giải thích từng phần của biểu thức, những bẫy riêng với chữ tiếng Việt, cách nhận biết mẫu có thể làm treo chương trình, và lúc nào nên bỏ biểu thức chính quy để viết vài dòng mã bình thường thay thế.

Vì sao biểu thức chính quy cần cách giao việc riêng

Một biểu thức chính quy dài hai dòng có thể chứa hàng chục quyết định: ký tự nào được phép, lặp bao nhiêu lần, khớp cả chuỗi hay một phần, phân biệt hoa thường hay không. Khác với một hàm thông thường, bạn không thể đọc lướt một biểu thức và thấy nó sai ở đâu. Kể cả lập trình viên lâu năm cũng thường phải thử mới biết.

Trợ lý AI viết biểu thức chính quy khá thạo vì đây là dạng văn bản xuất hiện rất nhiều trong dữ liệu huấn luyện. Nhưng cũng chính vì vậy, nó hay đưa ra mẫu phổ biến nhất cho một loại việc — mẫu email, mẫu ngày tháng — thay vì mẫu khớp đúng dữ liệu của bạn. Một mẫu ngày tháng viết cho kiểu tháng trước ngày sau của Mỹ sẽ khớp nhầm hoặc trượt với ngày kiểu Việt Nam.

Thêm nữa, cú pháp biểu thức chính quy khác nhau giữa các ngôn ngữ: Python, JavaScript, PHP, công cụ dòng lệnh như grep và cơ sở dữ liệu đều có những điểm lệch. Một mẫu chạy đúng ở công cụ thử trên trình duyệt chưa chắc chạy đúng trong mã PHP trên máy chủ của bạn.

Mẫu câu lệnh viết biểu thức chính quy

Điền phần trong ngoặc vuông. Bài toán ví dụ dưới là giả định: tìm mã đơn hàng trong tin nhắn khách gửi.

  • "Viết biểu thức chính quy dùng trong [Python 3, hàm re.search / JavaScript, phương thức match / PHP, preg_match]."
  • "Mục đích: [tìm mã đơn hàng dạng chữ DH, gạch nối, năm bốn chữ số, gạch nối, năm chữ số, nằm ở bất kỳ đâu trong câu]."
  • "Phải khớp: [DH-2026-12345; Cho hỏi đơn DH-2025-54321 đi chưa; mã dh-2026-11111 viết thường]."
  • "Phải KHÔNG khớp: [DH-26-12345; DH-2026-1234; XDH-2026-12345; DH-2026-123456]."
  • "Giải thích từng phần của biểu thức bằng một dòng tiếng Việt. Kèm đoạn mã ngắn chạy toàn bộ hai danh sách trên và in ra chuỗi nào khớp."

Danh sách "phải không khớp" là phần quan trọng nhất và hay bị quên nhất. Thiếu nó, biểu thức .* cũng "khớp đúng" mọi ví dụ của bạn. Hai ví dụ cuối trong danh sách trượt — có chữ thừa phía trước và có chữ số thừa phía sau — buộc trợ lý phải xử lý ranh giới từ, thứ mà mẫu đơn giản thường bỏ qua.

Bắt trợ lý giải thích từng phần, rồi tự đọc lại

Lời giải thích từng phần có hai tác dụng. Thứ nhất, bạn hiểu biểu thức đủ để sửa sau này mà không phải hỏi lại. Thứ hai, lời giải thích thường để lộ chỗ trợ lý hiểu sai đề. Nếu nó viết "phần này khớp năm bất kỳ có hai đến bốn chữ số" trong khi bạn cần đúng bốn chữ số, bạn thấy ngay mà chưa cần chạy.

Với mẫu mã đơn hàng ở trên, một lời giải hợp lý trong Python có dạng \bDH-\d{4}-\d{5}\b dùng kèm cờ không phân biệt hoa thường. Lời giải thích sẽ nêu: \b là ranh giới từ để không khớp khi có chữ dính liền phía trước hay phía sau; \d{4} là đúng bốn chữ số; cờ không phân biệt hoa thường để nhận cả dh viết thường.

Đến đây vẫn còn chi tiết đáng hỏi thêm: dấu gạch nối khách gõ trên điện thoại có thể là gạch ngang dài hoặc dấu cách. Bạn có muốn chấp nhận cả các biến thể đó không? Đó là quyết định nghiệp vụ, không phải quyết định kỹ thuật, và trợ lý không tự biết được.

Biểu thức chính quy và chữ tiếng Việt

Chữ có dấu là nguồn lỗi riêng khi dùng biểu thức chính quy ở Việt Nam. Bảng tóm tắt những điểm cần nói rõ với trợ lý; hành vi cụ thể nên chạy thử trên đúng phiên bản bạn dùng.

Vấn đềĐiều xảy raCách yêu cầu
Lớp \wTrong Python 3 với chuỗi Unicode, \w nhận cả chữ có dấu; trong JavaScript, \w chỉ nhận chữ Latin không dấuNêu rõ ngôn ngữ; với JavaScript yêu cầu dùng \p{L} kèm cờ u
PHP và UTF-8Không có cờ u, preg_match xử lý theo từng byte nên chữ có dấu bị cắt đôiYêu cầu luôn có cờ u khi xử lý chuỗi tiếng Việt
Dấu dựng sẵn và dấu tổ hợpCùng chữ "ế" có thể được lưu bằng một hoặc hai ký tự, nhìn giống hệt nhau nhưng không khớp nhauChuẩn hoá chuỗi về dạng NFC trước khi so khớp
Không phân biệt hoa thườngCờ này có thể không áp dụng cho chữ có dấu ở một số môi trường nếu thiếu chế độ UnicodeThử với "Đ" và "đ", "Ế" và "ế" trong danh sách ví dụ
Ranh giới từ \bỞ môi trường chỉ hiểu ASCII, chữ có dấu bị coi là ranh giớiĐưa ví dụ có chữ có dấu đứng sát mẫu cần tìm

Cách chắc nhất là luôn có ít nhất hai ví dụ chứa chữ có dấu trong cả hai danh sách khớp và không khớp. Nếu biểu thức xử lý sai, bạn biết ngay khi chạy, thay vì biết khi khách tên Đặng hay Nguyễn Thị Ánh báo lỗi.

Mẫu có thể làm treo chương trình

Hiện tượng. Một số biểu thức có cấu trúc lặp lồng nhau, ví dụ dạng (a+)+ hoặc (.*)* ghép với phần khác, có thể khiến bộ máy so khớp thử một số khả năng tăng theo cấp số nhân khi gặp chuỗi không khớp. Chuỗi dài vài chục ký tự đã đủ làm tiến trình chạy rất lâu. Hiện tượng này thường được gọi là ReDoS.

Vì sao liên quan tới mã AI viết. Trợ lý đôi khi tạo ra mẫu lặp lồng khi cố làm biểu thức "linh hoạt", nhất là với yêu cầu mơ hồ như "khớp mọi kiểu địa chỉ". Mẫu đó chạy nhanh với ví dụ đẹp của bạn và chỉ chậm với đầu vào xấu.

Cách phòng. Với biểu thức áp lên dữ liệu người dùng gửi lên, thêm vào câu lệnh: "tránh lượng từ lặp lồng nhau và giải thích vì sao số bước quay lui không tăng vọt với chuỗi dài". Giới hạn độ dài chuỗi trước khi so khớp. Thêm vào danh sách không khớp một chuỗi dài gần khớp rồi đo thời gian chạy.

Công cụ hỗ trợ. Một số công cụ phân tích mã tĩnh có quy tắc phát hiện mẫu dễ treo. Nếu dự án đã dùng công cụ như vậy trong quy trình kiểm tra, để nó quét cả biểu thức AI viết.

Thử biểu thức ở đâu và với dữ liệu gì

Cách thử đáng tin nhất là chạy trong chính ngôn ngữ và môi trường sẽ dùng, bằng đoạn mã ngắn lặp qua hai danh sách ví dụ. Đó là lý do mẫu câu lệnh ở trên yêu cầu trợ lý viết kèm đoạn mã chạy thử. Bạn chạy đoạn đó trên máy mình, không tin dòng "đã thử và khớp đúng" trong câu trả lời.

Các trang thử biểu thức chính quy trên mạng tiện để xem trực quan từng phần khớp, nhưng nhớ chọn đúng "hương vị" ngôn ngữ trong cài đặt của trang, và không dán dữ liệu thật của khách vào đó. Tin nhắn, địa chỉ, số điện thoại của khách là dữ liệu cá nhân; tạo ví dụ giả có cùng hình dạng thay vì sao chép.

Khi biểu thức đã đúng, giữ hai danh sách ví dụ lại thành một ca kiểm thử trong dự án. Sau này ai đó sửa biểu thức để nhận thêm một kiểu mã mới, kiểm thử đó sẽ báo ngay nếu kiểu cũ bị hỏng.

Dùng biểu thức để thay thế: nhóm bắt và cú pháp khác nhau

Nhiều việc không dừng ở tìm mà cần thay: đổi ngày từ dạng năm-tháng-ngày sang ngày/tháng/năm, gom nhiều dấu cách thành một, che bớt chữ số ở giữa một chuỗi mã. Những việc này dùng nhóm bắt — phần biểu thức đặt trong ngoặc tròn — để giữ lại một phần chuỗi rồi ghép vào chuỗi mới. Đây là chỗ khác biệt cú pháp giữa các ngôn ngữ gây lỗi nhiều nhất.

Trong chuỗi thay thế, Python dùng \1 hoặc \g<1> để chỉ nhóm thứ nhất, JavaScript dùng $1, còn preg_replace của PHP nhận cả hai kiểu. Nhóm có tên cũng khác: Python viết (?P<ten>...), JavaScript viết (?<ten>...). Một mẫu thay thế chép từ ví dụ JavaScript sang Python có thể không báo lỗi mà chèn nguyên chữ $1 vào kết quả.

Vì vậy câu lệnh cho việc thay thế nên đưa ví dụ theo cặp trước và sau: "2026-10-28 phải thành 28/10/2026; chuỗi không phải ngày thì giữ nguyên." Vế sau quan trọng không kém vế trước, vì thay thế áp lên toàn bộ văn bản và mọi chỗ khớp nhầm đều bị sửa theo. Chạy trên một bản sao dữ liệu, so sánh trước sau, rồi mới áp lên dữ liệu thật.

Khi nào nên bỏ biểu thức chính quy

Không phải việc xử lý chuỗi nào cũng nên làm bằng biểu thức chính quy. Phân tích HTML, JSON hay CSV có ngoặc kép lồng nhau bằng biểu thức là cách dễ vỡ; mỗi ngôn ngữ đều có thư viện chuẩn làm việc đó đúng hơn. Kiểm tra email đúng tuyệt đối theo chuẩn bằng một biểu thức là việc gần như vô ích; kiểm sơ bộ rồi gửi thư xác nhận mới là cách thực tế.

Dấu hiệu nên dừng: biểu thức dài quá một dòng màn hình, trợ lý phải giải thích mười mấy phần, và mỗi lần bạn thêm ví dụ lại phải sửa. Lúc đó hỏi trợ lý thẳng: "Viết lại việc này bằng mã thường, tách từng bước, không dùng biểu thức chính quy, rồi so sánh độ dễ đọc." Vài dòng tách chuỗi và kiểm điều kiện thường dễ bảo trì hơn một biểu thức mà chỉ người viết hiểu.

Câu hỏi thường gặp

Nhờ AI giải thích một biểu thức chính quy có sẵn có đáng tin không?

Thường khá chính xác với biểu thức phổ biến, nhưng vẫn có thể sai ở chi tiết như phạm vi của một lớp ký tự hay hành vi của cờ. Cách kiểm là yêu cầu kèm ví dụ khớp và không khớp cho từng phần, rồi chạy các ví dụ đó.

Có nên dùng biểu thức chính quy để kiểm số điện thoại Việt Nam không?

Có thể dùng để kiểm sơ bộ định dạng, như độ dài và ký tự hợp lệ. Nhưng đầu số các nhà mạng thay đổi theo thời gian, nên đừng mã hoá cứng danh sách đầu số vào biểu thức. Chấp nhận định dạng chung và để bước xác thực thật, như gửi mã, quyết định số có dùng được không.

Biểu thức chính quy trong SQL có giống trong Python không?

Không hoàn toàn. MySQL, PostgreSQL và SQLite hỗ trợ biểu thức chính quy ở mức khác nhau, với cú pháp hàm khác nhau. Khi nhờ AI, nói rõ hệ quản trị và phiên bản, và thử trên một bảng nhỏ trước khi chạy trên dữ liệu lớn vì so khớp biểu thức thường không dùng được chỉ mục.

Dùng biểu thức chính quy để đổi tên hàng loạt trong mã nguồn có an toàn không?

Rủi ro nếu không xem trước. Một mẫu thay thế có thể chạm vào chuỗi trong chú thích, trong nội dung văn bản hay tên trùng một phần. Dùng tính năng xem trước của trình soạn thảo, làm trên nhánh git riêng, và đọc lại phần khác biệt trước khi lưu thay đổi.

Khi AI đưa biểu thức có lookbehind, cần lưu ý gì?

Lookbehind là tính năng không phải môi trường nào cũng hỗ trợ đầy đủ, và một số bộ máy chỉ cho phép độ dài cố định. Nếu mã chạy ở trình duyệt cũ hoặc công cụ dòng lệnh, hỏi trợ lý xem có cách viết không dùng lookbehind không và thử trên đúng môi trường đích.

Cần tư vấn cụ thể cho trường hợp của bạn?

Chúng tôi sẽ liên hệ trong vòng 24 giờ.

Đăng ký tư vấn ngay

Bài viết liên quan

Bạn cần hỗ trợ thêm?

Để lại thông tin, chúng tôi sẽ liên hệ trong 24 giờ.

hoặc
Gọi ngay 0926 138 138