🐷 Regexp 🐷

Loại trừ bộ nhớ khỏi nhóm trong biểu thức chính quy Regular

Để loại trừ bộ nhớ khỏi nhóm thì chúng ta dùng (?:). Đi kèm với đó thì mất đi cơ hội.
js_masterRegular
Regular-Expression-trong-JavaScript.jpg

Chào các bạn

Trong bài viết này mình sẻ nói về loại trừ nhóm (?:) khỏi bộ nhớ

Nhóm

Bình thường nhóm () có bộ nhớ. Mà kết quả của bộ nhớ đó nó giúp chúng ta rất nhiều. Có thể truy cập nó theo tên \k<name> hoặc theo thứ tự của nhóm \n. n ở đây chính là số. Được đánh dấu theo thứ tự nhóm chúng ta.

Nhưng trong bài viết này mình chỉ nói đến loại trừ khỏi bộ nhớ của nhóm.

Bình thường khi chúng ta không loại trừ khỏi nhóm thì kết quả của bộ nhớ ấy sẽ xuất hiện trong đầu ra của mảng chúng ta.

  • Trận đấu /(123)/
1let str = "03123456789 (123) 0123123) 0123123123";
2
3let reg = /(123)/
4
5let ketQua = str.match(reg);
6
7console.log(ketQua); // ['123', '123', index: 2, input: '03123456789 (123) 0123123) 0123123123', groups: undefined]
8
9// ['123', '123', index: 2, input: '03123456789 (123) 0123123) 0123123123', groups: undefined]
10//          \1 tương đương chuỗi `123`
11//          \1 đây là kết quả từ bộ nhớ của nhóm

Cũng tương tự như vậy nếu chúng ta có nhiểu nhóm hơn nữa thì mảng trận đấu của chúng ta lại có thêm các giá trị của trận đấu nhóm.

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

Khi mình nhóm thêm số (2) thì bây giờ kết quả của mảng trận đấu chúng ta đả thêm chuỗi số "2" vào. Nếu mình nhóm thêm số (3) nữa thì cùng xem điều gì sẻ xảy ra nhé.

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

Bây giờ thì kết quả đầu ra của mảng chúng ta lại thêm chuỗi số "3".

Lưu Ý: trong mảng kết quả đầu ra ngay vị trí số 0 luôn luôn là kết quả của toàn trận đấu ketQua[0]. Còn ngay vị trí số 1 đến index chính là nhóm của chúng ta. Như kết quả trên thì tương ứng \1 \2 \3. Đến bài sau thì mình sẽ nói về cái này.

Nếu chúng ta không thích nó xuất hiện ở mảng đầu ra thì chúng ta chỉ cần thêm (?:) ở đầu của mỗi nhóm.

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

Ở ví dụ trên thì mình chỉ thêm (?:) ở nhóm thứ 1. Bây giờ thì chuỗi "123" không còn trong mảng đầu ra nữa. Tương tự với tất cả nhóm còn lại

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

Nhược điểm bây giờ là chúng ta mất đi cơ hội nhớ của nhóm.

Ví dụ: Chúng ta có thẻ <h1> chúng ta muốn tìm thẻ đóng của nó </h1. Bình thường thì chúng ta hay làm như thế này.

  • Trận đấu /<h1>.+<\/h1>/
1let str = `
2            <div>
3                <h1> Tiêu Đề </h1>
4            </div>
5        `
6
7let reg = /<h1>.+<\/h1>/;
8
9let ketQua = reg.exec(str);
10
11console.log(ketQua); // ['<h1> Tiêu Đề </h1>', index: 35, input: '\n            <div>\n                <h1> Tiêu Đề </h1>\n            </div>\n        ', groups: undefined]

Đơn nhiên là chúng ta cũng có thể viết kiểu khác. Bây giờ chúng ta qua sài nhóm.

  • Trận đấu /<(h1)>.+<\/\1>/
1let str = `
2            <div>
3                <h1> Tiêu Đề </h1>
4            </div>
5        `
6
7let reg = /<(h1)>.+<\/\1>/;
8
9let ketQua = reg.exec(str);
10
11console.log(ketQua); // ['<h1> Tiêu Đề </h1>', 'h1', index: 35, input: '\n            <div>\n                <h1> Tiêu Đề </h1>\n            </div>\n        ', groups: undefined]

\1 mình chưa viết bài nên bây giờ mình giải thích tí cho bạn hiểu. \1 tương đương với nhóm thứ nhất trong trận đấu của chúng ta tính từ trái sang phải. Tức là nó tương đương với h1. Đơn nhiên nếu chúng ta thay h1 thành abc gì đó thì bây giờ \1 của chúng ta cũng sẽ bằng abc. Đến bài sau mình sẽ nói rõ hơn.

Nếu chúng ta loại trừ khỏi nhóm (?:h1) thì \1 bây giờ chúng ta không biết đó là gì cả.

  • Trận đấu /<(?:h1)>.+<\/\1>/
1let str = `
2            <div>
3                <h1> Tiêu Đề </h1>
4            </div>
5        `
6
7let reg = /<(?:h1)>.+<\/\1>/;
8
9let ketQua = reg.exec(str);
10
11console.log(ketQua); // null

Như ví dụ trên là chúng ta mất đi cơ hội làm việc với nhóm rồi đó.

Càng ngày càng lên cao các bạn sẽ thấy trận đấu của chúng ta càng ngày càng phức tạp ra. Nó có rất rất là nhiều thứ phải học. Mà muốn hiểu được nó thì bắt buộc các bạn phải hiểu ý nghĩa của từng ký tự đặc biệt đó.

Tổng kết

Trong bài viết này mình đã hướng dẫn các bạn biết cách loại trừ bộ nhớ khỏi nhóm rồi đó. Khi chúng ta loại trừ đi thì chúng ta cũng mất đi cơ hội làm việc với những thứ khác.

Cuối cùng các bạn chỉ cần nhớ nếu thấy (?:) ở đầu của nhóm chính là Loại trừ bộ nhớ khỏi nhóm

Ok. hẹn gặp bạn ở các bài sau.

  • nhóm
  • loại trừ
  • regexp
  • regular
  • string
  • object
  • function

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