Regex Lookahead
Cú pháp regex sử dụng (?=...) và (?!...) để khớp dựa trên những gì theo sau mà không tiêu thụ ký tự.
Regex lookahead là xác nhận zero-width kiểm tra xem mẫu có tồn tại phía trước vị trí hiện tại hay không mà không thực sự tiêu thụ (di chuyển qua) các ký tự đó. Lookahead dương (?=...) thành công khi mẫu bên trong khớp phía trước, trong khi lookahead âm (?!...) thành công khi mẫu không khớp. Ví dụ, \d+(?=px) khớp số theo sau bởi "px" nhưng không bao gồm "px" trong kết quả khớp.
Lookahead đặc biệt hữu ích cho xác thực mật khẩu. Mẫu ^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$ xác minh mật khẩu chứa chữ hoa, chữ thường, chữ số và ký tự đặc biệt, tất cả trong một biểu thức. Mỗi lookahead kiểm tra một yêu cầu độc lập mà không ảnh hưởng đến vị trí khớp. Bạn có thể tham khảo sách nhập môn regex về kỹ thuật lookahead.
Một ứng dụng thực tế phổ biến là chèn dấu phân cách hàng nghìn. Mẫu (\d)(?=(\d{3})+(?!\d)) khớp các vị trí nơi nên chèn dấu phẩy: thay thế bằng $1, chuyển "1234567" thành "1,234,567". Điều này kết hợp lookahead dương (nhóm ba chữ số) với lookahead âm (không theo sau bởi chữ số nữa).
Lookbehind ((?<=...) dương và (?<!...) âm) là đối tác kiểm tra phía sau vị trí hiện tại. Ví dụ, (?<=\$)\d+ khớp số đứng sau ký hiệu đô la. Lookbehind có hạn chế hơn lookahead trong một số engine - JavaScript hỗ trợ lookbehind từ ES2018, nhưng một số engine cũ hơn không hỗ trợ hoặc yêu cầu mẫu có độ dài cố định.
Một quan niệm sai lầm phổ biến là lookahead tiêu thụ ký tự. Vì chúng là zero-width, nhiều lookahead có thể kiểm tra cùng một vị trí. Tuy nhiên, lookahead lồng nhau hoặc kết hợp với quay lui có thể tạo ra các mẫu có hiệu suất kém (thảm họa quay lui). Luôn kiểm tra mẫu regex với đầu vào lớn để đảm bảo hiệu suất chấp nhận được. Bạn có thể tham khảo sách hướng dẫn regex thực hành để tìm hiểu thêm.
Từ góc độ đếm ký tự, lookahead cho phép đếm ký tự có điều kiện. Ví dụ, đếm chữ số chỉ khi chúng theo sau bởi đơn vị cụ thể (\d+(?=px|em|rem)), hoặc tìm từ không theo sau bởi dấu câu. Điều này cho phép phân tích văn bản tinh vi kết hợp đếm ký tự với nhận dạng mẫu.