Nhóm (groups) ==> (…)
- Nếu chúng ta đặt một định lượng(quantifiers) sau dấu ngoặc đơn, nó sẽ áp dụng cho toàn bộ dấu ngoặc đơn.
- Cho phép lấy 1 phần kết quả riêng biệt trong nhóm
Ví dụ: gogogo
Không có dấu ngoặc đơn, mẫu go+có nghĩa là g ký tự, được o lặp lại một hoặc nhiều lần. Ví dụ, goooohoặc gooooooooo.
Trường hơn có nhóm: ()
alert( 'Gogogo now!'.match(/(go)+/ig) ); // "Gogogo"
Ví dụ tìm tên miền:
//mail.com
//users.mail.com
//smith.users.mail.com
let regexp = /(\w+\.)+\w+/g;
alert( "site.com my.site.com".match(regexp) ); // site.com,my.site.com
Ví dụ tìm email:
let regexp = /[-.\w]+@([\w-]+\.)+[\w-]+/g;
alert("[email protected] @ [email protected]".match(regexp)); // [email protected], [email protected]
Tìm Thẻ HTML:
let str = '<h1>Hello, world!</h1>';
let tag = str.match(/<(.*?)>/);
alert( tag[0] ); // <h1>
alert( tag[1] ); // h1
Nhóm lồng nhau:
let str = '<span class="my">';
let regexp = /<(([a-z]+)\s*([^>]*))>/;
let result = str.match(regexp);
alert(result[0]); // <span class="my">
alert(result[1]); // span class="my"
alert(result[2]); // span
alert(result[3]); // class="my"
Nhóm Tùy Chọn ()?
let match = 'azc'.match(/a(z)?(c)?/);
alert( match.length ); // 3
alert( match[0] ); // azc
alert( match[1] ); // z
alert( match[2] ); // c
Nhóm được đặt tên
Đặt tên để thuận tiện cho việc ghi nhớ dấu ngoặc đơn
Cú pháp đặt tên: ?<name> ngay sau dấu mở đầu.
let dateRegexp = /(?<year>[0-9]{4})-(?<month>[0-9]{2})-(?<day>[0-9]{2})/;
let str = "2019-04-30";
let groups = str.match(dateRegexp).groups;
alert(groups.year); // 2019
alert(groups.month); // 04
alert(groups.day); // 30
Sử dụng matchAll để tìm tất cả:
let dateRegexp = /(?<year>[0-9]{4})-(?<month>[0-9]{2})-(?<day>[0-9]{2})/g;
let str = "2019-10-30 2020-01-01";
let results = str.matchAll(dateRegexp);
for(let result of results) {
let {year, month, day} = result.groups;
alert(`${day}.${month}.${year}`);
// first alert: 30.10.2019
// second: 01.01.2020
}
Nhóm thay thế:
str.replace(regexp, replacement);
//thay thế tất cả các kết quả phù hợp với regexp trong str
//cho phép sử dụng nội dung dấu ngoặc đơn trong replacement chuỗi.
//Đó là sử dụng xong $n, n số nhóm
Ví dụ: Thay thế
let str = "John Bull";
let regexp = /(\w+) (\w+)/;
alert( str.replace(regexp, '$2, $1') ); // Bull, John
Ví dụ định dạng ngày tháng:
let regexp = /(?<year>[0-9]{4})-(?<month>[0-9]{2})-(?<day>[0-9]{2})/g;
let str = "2019-10-30, 2020-01-01";
alert( str.replace(regexp, '$<day>.$<month>.$<year>') );
// 30.10.2019, 01.01.2020
LOẠI TRỪ NHÓM VỚI ?:
Một nhóm có thể bị loại trừ bằng cách thêm ?: vào đầu.
let str = "Gogogo John!";
// ?: excludes 'go' from capturing
let regexp = /(?:go)+ (\w+)/i;
let result = str.match(regexp);
alert( result[0] ); // Gogogo John (full match)
alert( result[1] ); // John
alert( result.length ); // 2 (no more items in the array)
TỔNG HỢP CÁC VÍ DỤ:
// kiểm tra địa chỉ imac
var regexp = /^[0-9a-f]{2}(:[0-9a-f]{2}){5}$/i;
alert( regexp.test('01:32:54:67:89:AB') ); // true
alert( regexp.test('0132546789AB') ); // false (no colons)
alert( regexp.test('01:32:54:67:89') ); // false (5 numbers, need 6)
alert( regexp.test('01:32:54:67:89:ZZ') ) // false (ZZ in the end)
// tìm màu
var regexp = /#([a-f0-9]{3}){1,2}\b/gi;
var str = "color: #3f3; background-color: #AA00ef; and: #abcd";
alert( str.match(regexp) ); // #3f3 #AA00ef
// tìm số thập phân
var regexp = /-?\d+(\.\d+)?/g;
var str = "-1.5 0 2 -123.4.";
alert( str.match(regexp) ); // -1.5, 0, 2, -123.4
// tính toán
// 1 + 2
// 1.2 * 3.4
// -3 / -6
// -2 - 2
// toan tu là "+":, hoặc ."-""*""/"
// -?\d+(\.\d+)? // số đàu tiên
// [-+*/] // phương thức +-*\
// -?\d+(\.\d+)? // số thứ 2
function parse(expr) {
let regexp = /(-?\d+(?:\.\d+)?)\s*([-+*\/])\s*(-?\d+(?:\.\d+)?)/; //?: loại trừ ngoặc đơn
let result = expr.match(regexp);
if (!result) return [];
result.shift();
return result;
}
console.log( parse("-1.23 * 3.45") );
// mảng có shift()
//0: "-1.23"
//1: "*"
//2: "3.45"
// mảng không có shift()
//0: "-1.23 * 3.45"
//1: "-1.23"
//2: "*"
//3: "3.45"