💥 Regexp {x,y} 💥

Định lượng khối trong biểu thức chính quy Rgexp

Khối định lượng {x,y} có rất nhiều ý nghĩa. Hiểu được ý nghĩa của nó cũng rất quan trọng.
js_masterRegular
Regular-Expression-trong-JavaScript.jpg

Chào các bạn

Trong bài viết này này mình sẽ nói về định lượng {x,y}. Mình cũng không biết nên gọi tên là gì cả. Nên mình sẽ gọi nó là khối ngoặc nhọn nhé.

Định lượng

Để làm việc với đối tượng Regexp các bạn cũng bắt buộc phải nhớ nó {x,y}.

Cú pháp

1let str = "0123-456-789";
2
3let reg = str.match(/\d{x,y}/);
Ký tựMô tả
/{}/Nó có rất nhiều ý nghĩa. Có thể là Không hoặc Nhiều, Một hoặc Nhiều, hoặc có Số Lượng Nhất Định
  • Trận đấu /\d{x,y}/ có 2 ý nghĩa.

    1. \d là một số tương đương với /[0-9]/
    2. {x,y} định lượng này có 2 ý nghĩa
      • x Một số nguyên. Nếu mà không có y thì ý nói khớp với x n lần trở lên
      • y Một số nguyên. Nếu có x thì ý nói khớp với x đến phạm vi y

    Chúng ta sẽ phải đi vào ví dụ thì các bạn mới hiểu rõ được. Bởi mình viết bài mình cũng khó giải thích nếu ko có ví dụ.

Ví dụ:

  • /\d{0,}/

Trận đấu này có ý nghĩa là bắt đầu là 1 số \d tiếp theo là Không hoặc Nhiều {0,} tương đương với /\d*/

Không có cờ g

1let str = "0123-456-789";
2
3let reg = /\d{0,}/;
4
5let ketQua = str.match(reg);
6
7console.log(ketQua); // ['0123', index: 0, input: '0123-456-789', groups: undefined]

Như bạn có thể thấy. Đầu ra chúng ta là một mảng kết quả. Cái này mình đã nói trước. Hành vi này là do chức năng match() gây ra khi không có cờ g

Lưu Ý: Trận đấu /\d{0,}/ phải viết liền nhau. Không có khoảng cách gì đâu nhá. Trong chuỗi 1 ký tự cũng rất quan trọng.

Nếu có cờ g thì điều gì sẽ xảy ra. Chúng ta cùng xem tiếp ví dụ nhé.

Có cờ g

1let str = "0123-456-789";
2
3let reg = /\d{0,}/g;
4
5let ketQua = str.match(reg);
6
7console.log(ketQua); // ['0123', '', '456', '', '789', '']

Khi có cờ g hành vi của chức năng match() thay đổi. Bây giờ là một mảng kết quả. Vì ý nghĩa của trận đấu /\d{0,}/g này là Không hoặc Nhiều nên nó sẽ bao gồm các chuỗi trống trong mảng kết quả. Nó tương đương với trận đấu /\d*/g

1let str = "0123-456-789";
2
3let reg = /\d*/g;
4
5let ketQua = str.match(reg);
6
7console.log(ketQua); // ['0123', '', '456', '', '789', '']

Bây giờ chúng ta sẽ thay đổi trận đấu /\d{0,}/ thành /\d{1,}/ nhé.

  • /\d{1,}/

Ý nghĩa của trận đấu /\d{1,}/ này là. Bắt đầu bằng một số \d tiếp theo là Một hoặc Nhiều số {1,} tương đương với +

Ví dụ:

Không có cờ g

1let str = "0123-456-789";
2
3let reg = /\d{1,}/;
4
5let ketQua = str.match(reg);
6
7console.log(ketQua); // ['0123', index: 0, input: '0123-456-789', groups: undefined]

Kết quả của chúng ta cũng không có gì khác đúng không các bạn. Mặc dù khi không có cờ g thì kết quả của trận đấu /\d{1,}/ này với trận đấu /\d{0,}/ nhìn có vẽ giống nhau. Nhưng thật ra khác biệt rất lớn đó.

Có cờ g

1let str = "0123-456-789";
2
3let reg = /\d{1,}/g;
4
5let ketQua = str.match(reg);
6
7console.log(ketQua); // ['0123', '456', '789']

Như các bạn có thể thấy đầu ra của kết quả chúng ta bây giờ đã khác. Hành vi này nó cũng có sự tương đương.

Trận đấuTương đương
/\d{0,}//\d*/
/\d{0,}/g/\d*/g
/\d{1,}//\d+/
/\d{1,}/g/\d+/g

Bây giờ chúng ta cùng nhau xem tiếp. Điểm khác biệt lớn mà định lượng + với * không làm được.

  • /\d{0,3}/

Trận đấu này có ý nghĩa là. Bắt đầu bằng số \d tiếp theo là có Không đến Ba số.

Ví dụ:

Không có cờ g

1let str = "0123-456-789";
2
3let reg = /\d{0,3}/;
4
5let ketQua = str.match(reg);
6
7console.log(ketQua); // ['012', index: 0, input: '0123-456-789', groups: undefined]

Như bạn thấy đầu ra là một mảng. Ngay vị trí 0 của kết quả là trận đấu của chúng ta "012". Nếu chúng ta thay đổi chuuỗi nguồn bằng cách thêm 1 khoảng trắng ở trước thì xem điều gì xảy ra.

1let str = " 0123-456-789"; // Thay chuỗi nguồn bằng cách thêm 1 khoảng trắng ở trước
2
3let reg = /\d{0,3}/;
4
5let ketQua = str.match(reg);
6
7console.log(ketQua); // ['', index: 0, input: ' 0123-456-789', groups: undefined]

Như các bạn có thể thấy đầu ra kết quả bây giờ đã khác. Nó không còn là chuỗi "012" nữa mà bây giờ là chuỗi trống "". Hành vi này thay đổi là do định lượng {0,3} gây nên. Ý nghĩa nó là Không đến Ba. Còn Không đến Ba cái gì thì do ký tự ở trước xác định. Ở ví dụ trên là \d

Có cờ g

1let str = "0123-456-789";
2
3let reg = /\d{0,3}/g;
4
5let ketQua = str.match(reg);
6
7console.log(ketQua); // ['012', '3', '', '456', '', '789', '']

Khi có cờ g thì kết quả của chúng ta bây giờ đã khác. Nó bao gồm cả các chuỗi trống "" hành vi này do {0,3} gây nên. Bây giờ chúng ta thay trận đấu /\d{0,3}/g thành /\d{1,3}/g xem điều gì xảy ra.

1let str = "0123-456-789";
2
3let reg = /\d{1,3}/g;
4
5let ketQua = str.match(reg);
6
7console.log(ketQua); // ['012', '3', '456', '789']

Bây giờ kết quả đã thay đổi. Nó đã không còn những chuỗi trống "" không cần thiết nữa.

Bây giờ nếu chúng ta muốn lấy 4 số thì cứ thay đổi /\d{1,3}/g thành /\d{4,4}/g

1let str = "0123-456-7891234"; // Thay đổi chuỗi nguồn tí cho dể hình dung
2
3let reg = /\d{4,4}/g;
4
5let ketQua = str.match(reg);
6
7console.log(ketQua); // ['0123', '7891']

Củng từ các ví dụ căn bản đó. Giả sử bài toán chúng ta muốn tìm tất cả các từ có chính xác 4 chữ số thì làm như thế nào.

Ví dụ:

Không hoàn hảo

1let str = "012 3424 675 1234 553345 4255r6 erd23552ft s3424t";
2
3let reg = /\d{4,4}/g;
4
5let ketQua = str.match(reg);
6
7console.log(ketQua); // ['3424', '1234', '5533', '4255', '2355', '3424']

Như các bạn thấy đầu vào chuỗi nguồn của chúng ta rõ ràng chỉ có 3424 với 1234 là chính xác. Vậy tại sao mảng chúng ta lại có một mớ giá trị không chính xác kia.

Hoàn hảo

1let str = "012 3424 675 1234 553345 4255r6 erd23552ft s3424t";
2
3let reg = /\b\d{4,4}\b/g;
4
5let ketQua = str.match(reg);
6
7console.log(ketQua); // ['3424', '1234']

Đơn nhiên mình cũng chưa nói đến \b. Ở đây mình chỉ demo về nó thôi. Cho các bạn biết về ví dụ ở trên. Rồi từ từ mình sẽ viết về nó. Tốt nhất chúng ta nên học từng ý nghĩa của nó trước. Rồi mới gộp tất cả nó lại thành một thứ to lớn được.

Tổng kết

Trong bài viết này mình đã nói về định lượng {x,y}. Nó có 2 ý nghĩa. Các bạn đơn giản chỉ cần nhớ

  • {x,} Khi không có y thì nó khớp với x n lần
  • {x,y} Khi có cả xy thì nó khớp với phạm vi từ x đến y

[Ok]...

  • định lượng
  • khối
  • chuỗi
  • string
  • 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