🐮 Nhóm Regexp 🐮

Nhóm nội dung trong biểu thức chính quy Regexp

Nhóm () cũng là một ký tự đặc biệt trong Regular. Nó có rất nhiều thứ mà các bạn cần phải biết.
js_masterRegular
Regular-Expression-trong-JavaScript.jpg

Chào các bạn

Trong bài này mình sẻ nói về nhóm () trong đối tượng Regexp.

Nhóm

Nhóm () trong biểu thức chính quy cũng là một ký tự đặc biệt. Bắt buộc bạn phải nhớ nếu muốn làm việc với Regexp một cách hoàn hảo nhất.

Cú pháp

1let str = "0123456789 0123456789 0123456789";
2
3let reg = /(123)/;
Trận đấuMô tả
/()/Dùng để nhóm các ký tự với nhau thành một. Nó ghi nhớ vị trí các trận đấu bằng \n. n ở đây là số từ 1 đến đâu thì tùy vào số lượng nhóm. Đơn nhiên là còn nhiều cái khác nữa.
  • Trận đấu /(123)/
1let str = "0123456789 0123456789 0123456789";
2
3let reg = /(123)/;
4
5let ketQua = reg.exec(str);
6
7console.log(ketQua); // ['123', '123', index: 1, input: '0123456789 0123456789 0123456789', groups: undefined]

Ý nghĩa của trận đấu /(123)/ này là. Tìm số 123 trong chuỗi str đó. Phương pháp ở đây mình sử dụng là exec(). Đơn nhiên các bạn có thể dùng phương pháp khác. Tùy vào cách các bạn xử lý.

Để lấy tất cả các số 123 thì các bạn thêm cờ g vào đó.

  • Trận đấu /(123)/g
1let str = "0123456789 0123456789 0123456789";
2
3let reg = /(123)/g;
4
5while (true) {
6    let ketQua = reg.exec(str);
7    if (ketQua === null) {
8        break;
9    }
10    console.log(ketQua);
11    // ['123', '123', index: 1, input: '0123456789 0123456789 0123456789', groups: undefined]
12    // ['123', '123', index: 12, input: '0123456789 0123456789 0123456789', groups: undefined]
13    // ['123', '123', index: 23, input: '0123456789 0123456789 0123456789', groups: undefined]
14}

Hoặc chúng ta có thể dùng phương pháp matchAll().

1let str = "0123456789 0123456789 0123456789";
2
3let reg = /(123)/g;
4
5let ketQua = str.matchAll(reg);
6
7console.log([...ketQua]); 
8
9// [
10//  ['123', '123', index: 1, input: '0123456789 0123456789 0123456789', groups: undefined]
11//  ['123', '123', index: 12, input: '0123456789 0123456789 0123456789', groups: undefined]
12//  ['123', '123', index: 23, input: '0123456789 0123456789 0123456789', groups: undefined]
13// ]

Hoặc chúng ta có thể dùng phương pháp match() cho dể hình dung

1let str = "0123456789 0123456789 0123456789";
2
3let reg = /(123)/g;
4
5let ketQua = str.match(reg);
6
7console.log(ketQua); // ['123', '123', '123']

Nếu chúng ta kết hợp với các định lượng tham lam khác thì bây giờ ý nghĩa của trận đấu sẽ khác.

  • Trận đấu /(123)+/
1let str = "0123123456789 123 0123123 0123123123";
2
3let reg = /(123)+/;
4
5let ketQua = str.match(reg);
6
7console.log(ketQua); // ['123123', '123', index: 1, input: '0123123456789 123 0123123 0123123123', groups: undefined]

Ý nghĩa của trận đấu /(123)+/ trên là. Tìm số 123 có một hoặc nhiều số 123 liên tiếp nhau.

Khớp với: 123 123123 123.....123

Các bạn có thể thấy kết quả của mảng đầu ra chúng ta. Tự nhiên có chuỗi 123 trong đó. Cái này là do hành vi chủa nhóm () nó ghi nhớ kết quả của trận đấu lại. Để không muốn nó xuất hiện thì mình chỉ cần loại trừ nó ra khỏi nhóm bằng cách (?:123). Rồi mình cũng sẻ viết bài nói về nó.

  • Trận đấu /(?:123)+/
1let str = "0123123456789 123 0123123 0123123123";
2
3let reg = /(?:123)+/;
4
5let ketQua = str.match(reg);
6
7console.log(ketQua); // ['123123', index: 1, input: '0123123456789 123 0123123 0123123123', groups: undefined]

Chúng ta muốn lấy ra mảng kết quả thì cứ thêm cờ g cho nó.

  • Trận đấu /(?:123)+/g
1let str = "0123123456789 123 0123123 0123123123";
2
3let reg = /(?:123)+/g;
4
5let ketQua = str.match(reg);
6
7console.log(ketQua); // ['123123', '123', '123123', '123123123']

Đơn nhiên là chúng ta có thể kết hợp nhiều thứ hơn nữa. Chúng ta có thể lồng nhiều nhóm lại với nhau /(())/. Kết quả là trận đấu chúng ta ngày càng phức tạp hơn.

  • Trận đấu /(0(123)+\d)/
1let str = "0123123456789 123 0123123 0123123123";
2
3let reg = /(0(123)+\d)/;
4
5let ketQua = reg.exec(str);
6
7console.log(ketQua); // ['01231234', '01231234', '123', index: 0, input: '0123123456789 123 0123123 0123123123', groups: undefined]

Bây giờ trận đấu /(0(123)+\d)/ có ý nghĩa là. Bắt đầu bằng số 0 tiếp theo là số 123Một hoặc Nhiều số 123 nhóm nó lại () tiếp theo là số \drồi nhóm nó lại (). Nếu bạn chưa biết \d là gì thì nên xem lại tất cả các bài viết của mình nhá.

Khớp với: 01230 đến 01239 01231230 đến 01231239 0123...0 đến 0123...9

Nếu bạn muốn lấy nhiều kết quả hơn nữa thì thêm cờ g cho nó.

  • Trận đấu /(0(123)+\d)/g
1let str = "0123123456789 123 0123123 0123123123";
2
3let reg = /(0(123)+\d)/g;
4
5while (true) {
6    let ketQua = reg.exec(str);
7    if (Object.is(ketQua, null)) {
8        break;
9    }
10    console.log(ketQua); 
11    // ['01231234', '01231234', '123', index: 0, input: '0123123456789 123 0123123 0123123123', groups: undefined]
12    // ['01231', '01231', '123', index: 18, input: '0123123456789 123 0123123 0123123123', groups: undefined]
13    // ['01231231', '01231231', '123', index: 26, input: '0123123456789 123 0123123 0123123123', groups: undefined]
14}

Như bây giờ các bạn có thể thấy đầu ra của chúng ta bao gồm tất cả trận đấu của nhóm. Nếu bạn chưa biết thì mình sẽ giải thích như sau.

Chúng ta xem trận đấu /(0(123)+\d)/g nhóm luôn luôn có thứ tự. Bắt đầu từ trái sang phải.

  1. /(0(123)+\d)/g Toàn bộ trận đấu.
  2. (0(123)+\d) Nhóm thứ nhất tương đương \1
  3. (123) Nhóm thứ hai tương đương với \2
  4. ... và cứ như vậy

Cái này nó cũng phức tạp nên mình rất khó giải thích sao cho nó dể hiểu cả.

Nếu bạn muốn tìm ký tự ( với ) thì bắt buộc bạn phải thoát khỏi nó trong đối tượng regexp

  • Trận đấu /\(\d+?\)/g
1let str = "0123123456789 (123) 0123123) 0123123123";
2
3let reg = /\(\d+?\)/g;
4
5let ketQua = str.match(reg);
6
7console.log(ketQua); // ['(123)']

Trong ví dụ trên trận đấu /\(\d+?\)/g có ý nghĩa là. Bắt đầu bằng dấu ( tiếp theo là có Một hoặc Nhiều số \d+ tiếp theo là chế độ lười biến +? tiếp theo là dấu ) và cờ g sẽ chạy đến khi hết chuỗi.

Bình thường nếu chúng ta không thoát khỏi nhóm () thì ý nghĩa của nó là nhóm (). Khi chúng ta thoát \(\) thì ý nghĩa của nó là ký tự ( hoặc )

Trong bài viết này chúng ta chỉ nên cần biết nhóm () dùng để gom nhiều ký tự lại thành một.

  • Trận đấu /012{0,1}3/g
1let str = "03123456789 (123) 0123123) 0123123123";
2
3let reg = /012{0,1}3/g;;
4
5let ketQua = str.match(reg);
6
7console.log(ketQua); // ['0123', '0123']

Khi không có nhóm thì trận đấu /012{0,1}3/g này có ý nghĩa là. Tìm số 01 theo sau là Không hoặc Một {0,1} số 2 tiếp theo là số 3 và cờ g chạy hết chuỗi.

Khớp với: 013 0123

  • Trận đấu /0(12){0,1}3/g
1let str = "03123456789 (123) 0123123) 0123123123";
2
3let reg = /0(12){0,1}3/g;
4
5let ketQua = str.match(reg);
6
7console.log(ketQua); // ['03', '0123', '0123']

Khi có nhóm trận đấu /0(12){0,1}3/g này có ý nghĩa là. Bắt đầu bằng số 0 tiếp theo có Không hoặc Một {0,1} số 12 tiếp theo là số 3 và chạy hết chuỗi cờ g.

Khớp với: 03 0123

Tổng kết

Trong bài viết này mình đã giới thiệu các bạn về nhóm (). Và còn nhiều thứ về nhóm nữa. Nhưng mà mình chuyển sang bài khác để nói.

Chia nhỏ ra để nói cho các bạn dể hiểu. Hẹn gặp bạn ở bài viết sau.

  • nhóm
  • regular
  • string
  • regexp

OFFJS.COM - Blog học tập giải trí - 🐲

Chia sẻ nhiều kiến thức thú vị trong lập trình cũng như cuộc sống.

Giới thiệu


Trang web này mình sẽ nói về kiến thức lập trình và cuộc sống mà các bạn mới học hay đang dự định học. Có một bước đi đầu đời vững chắc.

Hồ Quang Trí.jpg

Đi kèm với đó là những lý thuyết và các dòng code minh họa. Để các bạn dễ hình dung.

Đơn nhiên cũng không dễ dàng ngày một ngày hai mà học hết được.

Học Tập Là Một Con Đường Dài Vô Tận

Nó sẽ nuốt các bạn vô số thời gian nhưng bù lại khi đã biết thì mọi thứ thật là tuyệt.

1console.log("Hồ Quang Trí");

Nếu có ai nói bạn học lập trình trong vòng 3 đến 6 tháng thì mình xin nói thật không bao giờ có chuyện đó nhé.

Chúc các bạn thành công.

Chân trang

phone-toan-phat.png

0353210168

address-toan-phat.png

Việt Nam