Tối Đa & Tối Thiểu (Greedy and lazy)
Chúng ta tạm hiểu:
Tối đa là: Greedy
Tối thiểu là : lazy
CHẾ ĐỘ Greedy
Xét ví dụ sau:
let regexp = /".+"/g;
let str = 'a "witch" and her "broom" is one';
alert( str.match(regexp) ); // "witch" and her "broom"
Ví dụ trên hoạt động không chính xác vì chúng ta chỉ cần lấy 2 giá trị:
"witch" và "broom" và kết quả là "witch" and her "broom"
Biểu thức trên được gọi là Tối đa( tham lam)
Chúng ta sẽ chuyển chúng thành biếu thức tối thiểu
CHẾ ĐỘ Lazy: (kích hoạt bằng dấu hỏi sau bộ định lượng)
let regexp = /".+?"/g;
let str = 'a "witch" and her "broom" is one';
alert( str.match(regexp) ); // "witch", "broom"
Biểu thức trên hoạt động .+? <==> .{1,}?
+? được gọi là định lượng tối thiểu nó chỉ lấy đến kết quả phù hợp ít nhất
Các bộ định lượng tối thiểu khác:
+?
*?
??
Ví Dụ:
alert( "123 456".match(/\d+ \d+?/) ); // 123 4
KHÔNG DÙNG BỘ ĐỊNH LƯỢNG ( DÙNG RANGE)
let regexp = /"[^"]+"/g; // dãy ngoại trừ dấu nháy kép
let str = 'a "witch" and her "broom" is one';
alert( str.match(regexp) ); // "witch", "broom"
TỔNG HỢP CÁC VÍ DỤ:
//1. Chế độ Tối Đa
var str = '...<a href="link" class="doc">...';
var regexp = /<a href=".*" class="doc">/g;
// Hoạt động
alert( str.match(regexp) ); // <a href="link" class="doc">
// 1.2 Chế Độ Tối Đa
var str = '...<a href="link1" class="doc">... <a href="link2" class="doc">...';
var regexp = /<a href=".*" class="doc">/g;
// Sai ! trong kết quả có cả 2 dấu chấm
alert( str.match(regexp) ); // <a href="link1" class="doc">... <a href="link2" class="doc">
// 2 Chế Độ Tối Thiểu (Lazy)
var str = '...<a href="link1" class="doc">... <a href="link2" class="doc">...';
var regexp = /<a href=".*?" class="doc">/g;
// Hoạt Động!
alert( str.match(regexp) ); // <a href="link1" class="doc">, <a href="link2" class="doc">
//2.1 chế độ tối thiểu (lazy)
var str = '...<a href="link1" class="wrong">... <p style="" class="doc">...';
var regexp = /<a href=".*?" class="doc">/g;
// sai!
alert( str.match(regexp) ); // <a href="link1" class="wrong">... <p style="" class="doc">
//2.2 fix lỗi trên
var str1 = '...<a href="link1" class="wrong">... <p style="" class="doc">...';
var str2 = '...<a href="link1" class="doc">... <a href="link2" class="doc">...';
var regexp = /<a href="[^"]*" class="doc">/g;
// Hoạt động!
alert( str1.match(regexp) ); // null, no matches, that's correct
alert( str2.match(regexp) ); // <a href="link1" class="doc">, <a href="link2" class="doc">