🤠 Định Lượng * 🤠

Định lượng sao * trong biểu thức chính quy Regexp

Định lượng * trong regexp rất phức tạp. Nó có thể thay đổi cách chúng ta tìm kiếm.
js_masterRegular
Regular-Expression-trong-JavaScript.jpg

Trong bài viết này mình sẽ nói về định lượng sao * trong đối tượng regexp

Định lượng

Định lượng * chúng ta bắt buộc phải nhớ để có thể làm việc với regexp một cách hiệu quả. Nó sẽ giúp ích cho chúng ta rất nhiều thứ.

Cú pháp

1let str = "Hồ Quang Trí";
2
3let reg = /T*/;
Cú phápMô Tả
/T*/Ý nghĩa của nó là Không Hoặc Nhiều ký tự T

Trong ví dụ ở trên ý nghĩa của /T*/ là mình đang tạo ra một đối tượng regexp. Và trận đấu của nó là. Có không hoặc nhiều ký tự T. Vì không có cờ hay gì khác nên ý nghĩa nó chỉ có vậy.

  • Nó sẽ khớp với T TT TTT T...T
1let str = "Hồ Quang Trí";
2
3let reg = /T*/;
4
5let ketQua = str.match(reg);
6
7console.log(typeof ketQua); // object
8console.log(ketQua); // ['', index: 0, input: 'Hồ Quang Trí', groups: undefined]

Như ví dụ trên tại sao có T trong chuỗi str mà kết quả đầu ra tại vị trí 0 lại chuỗi trống .

Rất đơn giản vì do định lượng * .

Ý của nó là có không hoặc nhiều ký tự T. Nhưng ở trên khớp với không nên nó trả về trống.

1// Hồ Quang Trí
2// T

Nó so sánh ký tự H với T không trùng nhau nên chức năng match() trả về mảng kết quả. Trong mảng kết quả có 4 giá trị

['', index: 0, input: 'Hồ Quang Trí', groups: undefined]

  1. '' Kết quả trận đấu chúng ta.
  2. index Vị trí kết quả trận đấu chúng ta.
  3. input Chuỗi nguồn của chúng ta.
  4. groups Nhóm kết quả. Rồi mình sẽ giải thích sau.

Cũng tùy vào phương pháp mà các bạn sử dụng nữa. Mà sẽ có đầu ra khác nhau nhé. Ở đây mình dùng phương pháp match()

Bây giờ chúng ta đổi lại chuỗi nguồn một tí. Và xem kết quả của nó.

1let str = "Trí";
2
3let reg = /T*/;
4
5let ketQua = str.match(reg);
6
7console.log(typeof ketQua); // object
8console.log(ketQua); // ['T', index: 0, input: 'Trí', groups: undefined]

Bây giờ thì nó đã hoạt động đúng. Nếu mà chỉ như vậy thì chúng ta cần gì phải học regexp cho mệt. Đúng không nào.

Cũng từ ví dụ đó chúng ta thay đỗi chuỗi nguồn tiếp.

1let str = "TTTTrí";
2
3let reg = /T*/;
4
5let ketQua = str.match(reg);
6
7console.log(typeof ketQua); // object
8console.log(ketQua); // ['TTTT', index: 0, input: 'TTTTrí', groups: undefined]

Trong ví dụ trên mình cố tình thay đổi chuỗi nguồn chúng ta thành "TTTTrí" Và bây giờ kết quả đầu ra đã thay đổi. Ngay vị trí 0 của mảng kết quả chúng ta có 'TTTT'

Câu hỏi bây giờ tại sao nó làm được điều đó. Rất đơn giản là nhờ định lượng *.

Cách chạy của nó.

Bắt đầu trận đấu của chúng ta /T*/ so sánh với chuỗi nguồn "TTTTrí" . Nó so sánh ký tự T với chuỗi nguồn "TTTTrí" và khớp với nhau. Bây giờ định lượng * hoạt động. Ý nghĩa của * là không hoặc nhiều. Nên nó lấy tiếp ký tự T của trận đấu so sánh tiếp với chuỗi nguồn "TTTTrí" và cứ như vậy.

  1. /T*/ so sánh với "TTTTrí"
    • T so sánh với "TTTTrí" => true
    • TT so sánh với "TTTTrí" => true
    • TTT so sánh với "TTTTrí" => true
    • TTTT so sánh với "TTTTrí" => true
    • TTTTT so sánh với "TTTTrí" => false

Như các bạn có thấy. Mình mô tả vậy cho các bạn dể hình dung. Khi trận đấu false thì kết quả cuối cùng true được trả lại. Và chức năng thực hiện cho hành động đó là match()

Chúng ta cùng thay đổi chuỗi nguồn và thêm cờ g cho nó nhé.

1let str = "Hồ Quang Trí Đề mô TTTTrí";
2
3let reg = /T*/g;
4
5let ketQua = str.match(reg);
6
7console.log(ketQua); // ['', '', '', '', '', '', '', '', '', 'T', '', '', '', '', '', '', '', '', '', 'TTTT', '', '', '']

Như bạn thấy đầu ra kết quả thật là dài. Thật ra đó là do định lượng * và chức năng match() thôi. Khi có cờ g thì hành vi của match() thay đổi. Bây giờ nó hoạt động như thế này.

chuỗi nguồn bằng "Hồ Quang Trí Đề mô TTTTrí"

  1. /T*/g so sánh với "Hồ Quang Trí Đề mô TTTTrí"
    • T so sánh chuỗi nguồn => ''
    • T so sánh chuỗi nguồn => ''
    • ...
    • T so sánh chuỗi nguồn => 'T'
    • T so sánh chuỗi nguồn => ''
    • ...
    • T* tương đương TTTT => TTTT
    • ...

Cứ như vậy. Đơn nhiên hành vi này thay đổi là do cờ g của chúng ta. Nếu không có cờ g thì kết quả nó như thế này.

1let str = "Hồ Quang Trí Đề mô TTTTrí";
2
3let reg = /T*/;
4
5let ketQua = str.match(reg);
6
7console.log(ketQua); // ['', index: 0, input: 'Hồ Quang Trí Đề mô TTTTrí', groups: undefined]

Lưu Ý: Tất cả các bước chạy ở trên là mình chỉ nói ra cho bạn hiểu thôi. Chứ thuật toán nó viết thì mình không biết được. Nhưng mà xử lý chuỗi thì kiểu gì nó cũng so sánh từng ký tự như vậy.

Định lượng * không chỉ có vậy mà còn có nhiều cái hay nữa.

1let str = "Hồ tí Quang Trí ";
2
3let reg = /Tr*í/;
4
5let ketQua = str.match(reg);
6
7console.log(ketQua); // ['Trí', index: 12, input: 'Hồ tí Quang Trí ', groups: undefined]

Ở ví dụ này trận đấu /Tr*í/ của chúng ta bây giờ có ý nghĩa khác. Ý nghĩa của nó là.

Băt đầu bằng ký tự T tiếp theo là không hoặc nhiều r theo sau đó là ký tự í

  • Nó sẽ khớp với chuỗi như thế này Trí Trrí Trrrrí và cứ như vậy có Tr...rí

Muốn lấy hết tất cả các kết quả trùng thì cờ g là bắt buộc.

1let str = "tí Trí trí Trrí Trrrrri Trrrrrrrrí";
2
3let reg = /Tr*í/g;
4
5let ketQua = str.match(reg);
6
7console.log(ketQua); // ['Trí', 'Trrí', 'Trrrrrrrrí']

Như bạn thấy đầu ra 1 mảng có 3 giá trị. Các bạn để ý kỹ i không bằng í nhé. Nên sẽ không có kết quả Trrrrri ở trong mảng.

Nếu chúng ta muốn tìm không phân biệt ký tự HOA hay thường thì thêm cờ i cho nó.

1let str = "tí Trí trí Trrí Trrrrri Trrrrrrrrí";
2
3let reg = /Tr*í/gi;
4
5let ketQua = str.match(reg);
6
7console.log(ketQua); // ['tí', 'Trí', 'trí', 'Trrí', 'Trrrrrrrrí']

Đơn nhiên là còn nhiều thứ nữa.

Ví dụ như nhóm

1let str = "0123 123 01230123 0000123 n 01230123";
2
3let reg = /(0123)*/g;
4
5let ketQua = str.match(reg);
6
7console.log(ketQua); //  ['0123', '', '', '', '', '', '01230123', '', '', '', '', '0123', '', '', '', '01230123', '']
  • Trận đấu /(0123)*/g có ý nghĩa là
    • 0123 Khớp với chuỗi 0123
    • (0123) Nhóm nó lại
    • (0123)* Định lượng * không hoặc nhiều chuỗi 0123 01230123 0123...0123 và cứ như vậy.

Và còn nhiều thứ nữa. Nhưng ở đây mình chỉ nói về định lượng *

Tổng kết

Trong bài viết này mình đã giải thích ý nghĩa của định lượng *. Các bạn chỉ cần nhớ ý nghĩa của nó là Không Hoặc Nhiều

  • chuỗi
  • string
  • object
  • js

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