Giới hạn tính tham lam trong biểu thức chính quy JavaScript
Biểu thức chính quy mặc định là tham lam. Điều này có nghĩa là chúng sẽ bắt số lượng ký tự tối đa có thể. Hãy cùng phân tích qua một ví dụ. Giả sử chúng ta có một chuỗi như sau:
let str = 'aeeex zzz x kkk';
Giả sử chúng ta muốn tìm chuỗi con
'aeeex' trong chuỗi này theo mẫu sau: chữ cái
'a', sau đó bất kỳ ký tự nào một hoặc nhiều lần,
sau đó là chữ cái 'x'.
let res = str.replace(/a.+x/g, '!');
Chúng ta dự đoán rằng kết quả ghi vào biến sẽ là
chuỗi '! zzz x kkk'. Tuy nhiên,
điều này không đúng - biến nhận được chuỗi
'! kkk'.
Vấn đề nằm ở chỗ biểu thức chính quy của chúng ta tìm tất cả
các ký tự từ chữ cái 'a' đến chữ cái 'x'.
Nhưng trong chuỗi của chúng ta có hai chữ cái 'x'! Do
tính tham lam, kết quả là biểu thức chính quy tìm đến
chữ 'x' cuối cùng, do đó bắt không đúng phần chúng ta mong đợi.
Tất nhiên, thường thì hành vi này là điều chúng ta cần. Nhưng cụ thể trong trường hợp này, chúng ta muốn tắt tính tham lam và nói với biểu thức chính quy hãy tìm đến chữ 'x' đầu tiên.
Để giới hạn tính tham lam, cần đặt dấu hỏi sau toán tử lặp:
let res = str.replace(/a.+?x/g, '!');
Có thể giới hạn tính tham lam cho tất cả các toán tử
lặp: cả *, ?, và {}
- như sau: *?, ?? và {}?.
Cho chuỗi:
let str = 'aba accca azzza wwwwa';
Viết biểu thức chính quy tìm tất cả các chuỗi
được bao quanh bởi chữ cái 'a',
và thay thế mỗi chuỗi đó bằng '!'. Giữa
các chữ cái 'a' có thể là bất kỳ ký tự nào (ngoại trừ
'a').