🐫 Regexp 🐫

Nhóm đặt tên và truy cập nhóm đặt tên trong Regular

Để đặt tên cho nhóm (?<name>) và truy cập vào nhóm đặt tên \k<name> trong regexp
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ề nhóm được đặt tên (?<name>) nó sẽ giúp ích cho các bạn rất nhiều.

Nhóm đặt tên

Đặt tên cho nhóm (?<name>) rất đơn giản. Tuy nhiên cũng có cái bất lợi là bây giờ trận đấu của chúng ta sẽ dài hơn. Nhưng bù lại bạn sẽ dể hình dung hơn.

Cú pháp

Trận đấuMô tả
/(?<name>)/Đặt tên cho nhóm
/(\k<name>)/Truy cập vào bộ nhớ của nhóm theo tên
  • Trận đấu /012(?<so3>3)45/
1let str = "0123453123456789";
2
3let reg = /012(?<so3>3)45/;
4
5let ketQua = reg.exec(str);
6
7console.log(ketQua); // ['0123453', '3', index: 0, input: '0123453123456789', groups: {so3: '3'}]
8
9console.log(ketQua.groups); // {so3: '3'}

Như ví dụ trên các bạn có thể thấy. Nhóm số 3 bây giờ mình đặt tên cho nó là (?<so3>3). Các bạn cũng có thể thay đổi tên khác thay cho so3 thành soKhac. Tùy theo cách đặt của bạn.

Cách đặt tên của chúng ta cũng không thay đổi gì đến trận đấu của chúng ta cả. Nó chỉ đơn giản là một trận đấu bình thường thôi. Nếu mình bỏ nhóm ra thì trận đấu trên tương đương như thế này.

  • /012(?<so3>3)45/ <=> /012345/

Đó chỉ là ví dụ thôi nhé. Nhóm chúng ta có nhiều lợi hại lắm.

Các bạn để ý kỷ đầu ra của chúng ta. Ở các ví dụ trước groups có giá trị là undefined. Nhưng khi chúng ta đặt tên cho nhóm (?<so3>3) thì bây giờ groups có giá trị là một đối tượng {so3: '3'}.

Chúng ta cũng có thể có nhiều nhóm hơn. Và chúng ta cũng đặt tên cho nhóm như thế. Sao cho dể hiểu nhất có thể. Cái này là tùy bạn.

  • Trận đấu /01(?<so2>2)(?<so3>3)45/
1let str = "0123453123456789";
2
3let reg = /01(?<so2>2)(?<so3>3)45/;
4
5let ketQua = reg.exec(str);
6
7console.log(ketQua); // ['012345', '2', '3', index: 0, input: '0123453123456789', groups: {…}]
8
9console.log(ketQua.groups); // {so2: '2', so3: '3'}

Ở trận đấu tên mình có đặt thêm nhóm số 2 và đồng thời đặt tên cho nhóm số 2 đó (?<so2>2). Bây giờ thì kết quả đầu ra chúng ta cũng đã khác hơn. Ở bài trước mình cũng có nói đến về cái này rồi. Nên bây giờ mình không nói nữa.

Nếu chúng ta nhóm nhiều hơn nữa và đặt tên cho nó nhiều hơn nữa. Thì trận đấu của chúng ta sẽ càng ngày càng dài hơn. Và rồi để mà hiểu trận đấu đó. Thì bắt buộc các bạn ngồi ngẫm mệt nghỉ.

  • Trận đấu /0(?<so1>1)(?<so2>2)(?<so3>3)45/
1let str = "0123453123456789";
2
3let reg = /0(?<so1>1)(?<so2>2)(?<so3>3)45/;
4
5let ketQua = reg.exec(str);
6
7console.log(ketQua); // ['012345', '1', '2', '3', index: 0, input: '0123453123456789', groups: {…}]
8
9console.log(ketQua.groups); // {so1: '1', so2: '2', so3: '3'}

Ở ví dụ trên mình nhóm số 1 lại và đặt tên cho nó thành số 1 đó (?<so1>1). Bây giờ thì trận đấu của chúng ta lại dài hơn. Chúng ta cùng nhau nhóm tiếp (123) lại với nhau luôn đi.

  • Trận đấu /0(?<sum123>(?<so1>1)(?<so2>2)(?<so3>3))45/
1let str = "0123453123456789";
2
3let reg = /0(?<sum123>(?<so1>1)(?<so2>2)(?<so3>3))45/;
4
5let ketQua = reg.exec(str);
6
7console.log(ketQua); // ['012345', '123', '1', '2', '3', index: 0, input: '0123453123456789', groups: {…}]
8
9console.log(ketQua.groups); // {sum123: '123', so1: '1', so2: '2', so3: '3'}

Ở ví dụ trên mình nhóm số 123 lại và đặt tên cho nhóm đó là (?<sum123>...). Dấu 3 chấm ... là tượng trưng cho các nhóm so1 so2 so3 các bạn nhé. Vì nó dài quá nên mình viết tắt. Đơn nhiên là chúng ta có thể nhóm nó tiếp. Bây giờ mình sẻ nhóm 23 lại.

  • Trận đấu /0(?<sum123>(?<so1>1)(?<sum23>(?<so2>2)(?<so3>3)))45/
1let str = "0123453123456789";
2
3let reg = /0(?<sum123>(?<so1>1)(?<sum23>(?<so2>2)(?<so3>3)))45/;
4
5let ketQua = reg.exec(str);
6
7console.log(ketQua); // ['012345', '123', '1', '23', '2', '3', index: 0, input: '0123453123456789', groups: {…}]
8
9console.log(ketQua.groups); // {sum123: '123', so1: '1', sum23: '23', so2: '2', so3: '3'}
10
11// ['012345', '123', '1', '23', '2', '3', index: 0, input: '0123453123456789', groups: {…}]
12
13// Dấu <=> Mình gọi là tương đương nhá.
14
15// ketQua[0] = '012345' <=> /0(?<sum123>(?<so1>1)(?<sum23>(?<so2>2)(?<so3>3)))45/
16// ketQua[1] = '123'    <=> (?<sum123>(?<so1>1)(?<sum23>(?<so2>2)(?<so3>3))) <=> \1
17// ketQua[2] = '1'      <=> (?<so1>1)                                        <=> \2
18// ketQua[3] = '23'     <=> (?<sum23>(?<so2>2)(?<so3>3))                     <=> \3
19// ketQua[4] = '2'      <=> (?<so2>2)                                        <=> \4
20// ketQua[5] = '3'      <=> (?<so3>3)                                        <=> \5

Bây giờ thì trông trận đấu của chúng ta thật là choáng nghợp đúng không các bạn. Ý nghĩa của nó bây giờ thì cũng chả có gì phức tạp cả. Chỉ là tìm số 012345 thôi.

Nói vậy thôi. Chứ bây giờ nếu chúng ta thêm \1 hoặc \k<sum123> thì ý nghĩa nó lại khác. Đơn nhiêu còn nhiều định lượng khác. Nếu vậy thì càng phức tạp nữa. Tốt nhất là chúng ta cứ đơn giản bớt.

  • Trận đấu /0(?<sum123>(?<so1>1)(?<sum23>(?<so2>2)(?<so3>3)))45\k<sum123>/
1let str = "012345123123456789";
2
3let reg = /0(?<sum123>(?<so1>1)(?<sum23>(?<so2>2)(?<so3>3)))45\k<sum123>/;
4
5let ketQua = reg.exec(str);
6
7console.log(ketQua); // ['012345123', '123', '1', '23', '2', '3', index: 0, input: '012345123123456789', groups: {…}]
8
9console.log(ketQua.groups); // {sum123: '123', so1: '1', sum23: '23', so2: '2', so3: '3'}

Ở ví dụ trên mình có thay đổi chuỗi nguồn lại tí. Để cho nó khớp với trận đấu chúng ta.

Vì nhóm có bộ nhớ. Mà để truy cập vào bộ nhớ đó thì chúng ta dùng \1 hoặc \k<name>. Ở trên mình dùng \k<sum123> nhóm được đặt tên (?<sum123>...). Và nhóm đó có giá trị là chuỗi 123. Các bạn nhìn trong groups là thấy. Vì mình đã log nó ra.

Bây giờ ý nghĩa của trận đấu /0(?<sum123>(?<so1>1)(?<sum23>(?<so2>2)(?<so3>3)))45\k<sum123>/ này là tìm số 012345123.

Đơn nhiên là hành vi này sẽ thay đổi nếu nhóm chúng ta có ký tự hoặc định lượng khác. Vì bây giờ chỉ cần thêm một định lượng thôi là cũng giải thích đuối luôn. Nên mình hạn chế. Đơn giản nhất có thể.

Nếu chúng ta thêm tiếp \k<so1> nữa thì bây giờ ý nghĩa trận đấu của chúng ta lại khác.

  • Trận đấu /0(?<sum123>(?<so1>1)(?<sum23>(?<so2>2)(?<so3>3)))45\k<sum123>\k<so1>/
1let str = "012345123123456789";
2
3let reg = /0(?<sum123>(?<so1>1)(?<sum23>(?<so2>2)(?<so3>3)))45\k<sum123>\k<so1>/;
4
5let ketQua = reg.exec(str);
6
7console.log(ketQua); // ['0123451231', '123', '1', '23', '2', '3', index: 0, input: '012345123123456789', groups: {…}]
8
9console.log(ketQua.groups); // {sum123: '123', so1: '1', sum23: '23', so2: '2', so3: '3'}

Tương tự như vậy với các số khác.

  • Trận đấu /0(?<sum123>(?<so1>1)(?<sum23>(?<so2>2)(?<so3>3)))4\k<sum23>5\k<sum123>\k<so1>/
1let str = "01234235123123456789";
2
3let reg = /0(?<sum123>(?<so1>1)(?<sum23>(?<so2>2)(?<so3>3)))4\k<sum23>5\k<sum123>\k<so1>/;
4
5let ketQua = reg.exec(str);
6
7console.log(ketQua); // ['012342351231', '123', '1', '23', '2', '3', index: 0, input: '01234235123123456789', groups: {…}]
8
9console.log(ketQua.groups); // {sum123: '123', so1: '1', sum23: '23', so2: '2', so3: '3'}

Ở ví dụ trên mình có thay đổi chuỗi nguồn tí. Cho nó khớp với trận đấu. Ý nghĩa của trận đấu trên là tìm số 012342351231.

Nếu mà nói thẳng ra thì thật ra \k<name> chỉ là giống như một cái biến có tên là name và giá trị là nhóm có tên (?<name>...).

Tổng kết

Trong bài viết này mình này mình đả nói cách đặt tên cho nhóm (?<name>...) và cách truy cập vào bộ nhớ của nhóm \k<name> rồi đó.

Nhiệm vụ của các bạn là chỉ cần nhớ cú pháp của nó thôi.

OK hẹn gặp lại bạn ở các bài sau

  • nhóm
  • string
  • regular
  • regexp
  • object

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