Regex Backreference

Tính năng tái sử dụng văn bản được khớp bởi nhóm bắt trong cùng một mẫu. Được tham chiếu bằng \1, \2, v.v.

Tham chiếu ngược regex là tính năng cho phép tái sử dụng văn bản được khớp bởi nhóm bắt (dấu ngoặc đơn) trong cùng một mẫu hoặc chuỗi thay thế. Trong mẫu, \1 tham chiếu đến văn bản được khớp bởi nhóm bắt đầu tiên, \2 đến nhóm thứ hai, v.v. Trong chuỗi thay thế, $1 hoặc \1 được sử dụng tùy thuộc vào ngôn ngữ. Ví dụ, mẫu (\w+)\s+\1 khớp các từ trùng lặp liên tiếp như "the the".

Tham chiếu ngược được sử dụng rộng rãi trong thao tác văn bản thực tế. Trong tái cấu trúc mã, chúng cho phép hoán đổi thứ tự đối số hàm hoặc chuyển đổi quy ước đặt tên (camelCase sang snake_case). Trong xác thực HTML, <(\w+)>.*?</\1> xác minh rằng thẻ mở và đóng khớp nhau. Trong xử lý dữ liệu, chúng cho phép sắp xếp lại các thành phần ngày (từ MM/DD/YYYY sang YYYY-MM-DD). Bạn có thể tham khảo sách thành thạo regex về kỹ thuật tham chiếu ngược nâng cao.

Cú pháp thay đổi theo ngôn ngữ lập trình. JavaScript sử dụng $1 trong chuỗi thay thế (str.replace(/(\w+)/, '$1')), Python sử dụng \1 trong re.sub(), và Java sử dụng $1 trong Matcher.replaceAll(). Nhóm bắt có tên ((?<name>...)) cung cấp tham chiếu dễ đọc hơn: \k<name> trong mẫu và ${name} trong thay thế.

Tham chiếu ngược có ý nghĩa về hiệu suất. Engine regex phải theo dõi văn bản được khớp cho mỗi nhóm bắt, tiêu tốn bộ nhớ. Với đầu vào lớn hoặc nhiều nhóm bắt, điều này có thể ảnh hưởng đến hiệu suất. Nhóm không bắt (?:...) nên được sử dụng khi chỉ cần nhóm mà không cần bắt, vì chúng tránh chi phí lưu trữ văn bản đã khớp.

Một quan niệm sai lầm phổ biến là tham chiếu ngược có thể giải quyết mọi vấn đề khớp mẫu. Trên thực tế, chúng tăng đáng kể độ phức tạp tính toán của khớp regex. Một số engine regex (đặc biệt là RE2 của Google) cố tình không hỗ trợ tham chiếu ngược để đảm bảo hiệu suất thời gian tuyến tính. Ngoài ra, tham chiếu ngược lồng nhau hoặc đệ quy có thể tạo ra các mẫu cực kỳ khó đọc và bảo trì. 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ự, tham chiếu ngược hữu ích cho phát hiện và loại bỏ văn bản trùng lặp. Ví dụ, tìm từ trùng lặp liên tiếp ((\b\w+\b)\s+\1) giúp dọn dẹp văn bản trước khi đếm. Kết hợp regex với tham chiếu ngược và công cụ đếm ký tự cho phép tiền xử lý văn bản chính xác.