• 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"