Bài học theo mô-đun (3/4)
Thay thế bằng một cuộc gọi lại
Nếu chuỗi thay thế không đủ, hãy truyền hàm:
str.replace(regex, (match, ...groups) => string). Cuộc gọi lại được gọi
cho mỗi trận đấu và giá trị trả về của nó sẽ trở thành giá trị thay thế.
'prezzi: 10 20 30'.replace(/\d+/g, (m) => Number(m) * 1.22);
// "prezzi: 12.2 24.4 36.6" (22% VAT)Đối số gọi lại
str.replace(regex, (match, p1, p2, ..., offset, original, groups) => ...);match-- toàn bộ trận đấu.p1,p2, \u2026 -- các nhóm đã bắt theo thứ tự.offset-- chỉ mục của kết quả khớp trong chuỗi gốc.original-- toàn bộ chuỗi.groups-- đối tượng với các nhóm được đặt tên (nếu có).
'2024-03-15'.replace(/(\d{4})-(\d{2})-(\d{2})/, (_, a, m, g) => `${g}/${m}/${a}`);
// "15/03/2024"Lệnh gọi lại cung cấp cho bạn sức mạnh tùy ý: phân tích cú pháp, tra cứu, chuyển đổi, HTML thoát\u2026 mọi thứ mà chuỗi tĩnh không thể làm được.
Đối số nâng cao trong lệnh gọi lại thay thế
Hàm gọi lại nhận được một số đối số: kết quả khớp đầy đủ, từng nhóm được ghi lại, phần bù của kết quả khớp trong toàn bộ văn bản và chuỗi đầu vào ban đầu. Điều này cho phép logic chuyển đổi dựa trên ngữ cảnh phức tạp.
Hãy thử nó
Tìm mọi số nguyên trong văn bản. (Để thay thế, bạn sẽ chuyển `(m) => Number(m) * 2` để nhân đôi nó.)
Hiển thị gợi ý
Sử dụng \\d+ (một hoặc nhiều chữ số) để nắm bắt mọi số nguyên dưới dạng một kết quả khớp.
Giải pháp khả dụng sau 3 lần thử
Xem lại bài tập
Tìm mọi email (dạng đơn giản: chữ cái/chữ số/dấu chấm/dấu gạch dưới @ tên miền). Bằng cách này, lệnh gọi lại có thể điều chỉnh lại thành `***@domain`.
Hiển thị gợi ý
Mở rộng lớp thành [\\w.]+ để chấp nhận các dấu chấm trong tên người dùng và tên miền.
Giải pháp khả dụng sau 3 lần thử
Thử thách bổ sung
Match every word consisting of letters in the text, so it can be transformed to uppercase via a callback.
Hiển thị gợi ý
Tìm các chữ cái đơn giản với [a-zA-Z]+.
Giải pháp khả dụng sau 3 lần thử