💦 Regexp 💦

Định lượng lười biến trong biểu thức chính quy Regexp

Định lượng lười biến *? +? ?? {0,1}? {0,}? {1,}? {x,y}? rất mạnh mẽ. Tuy chỉnh hành vi tham lam.
js_masterRegular
Regular-Expression-trong-JavaScript.jpg

Chào các bạn

Trong bài viết này chúng ta cùng nhau tìm hiểu về định lượng lười biến *? +? ??.

Định lượng

Định lượng lười biến *? +? ?? cũng là một ký tự đặc biệt mà chúng ta cũng bắt buộc phải nhớ.

Cú pháp

1let str = "0123456789";
2
3let reg = /\d*?4/;
  1. Trận đấu /\d*?4/
    • \d Ở đây là số cũng có thể là bất cứ thứ gì tùy vào bạn. Ở ví dụ này là \d vì mình đang làm ví dụ về số.
    • *? Chế độ lười biến mà chúng ta đang học.
    • 4 Chính là số mà chúng ta muốn chế độ lười biến hỏi. Cũng có thể là bất cứ cái gì tùy bạn.

Ý Nghĩa: của trận đấu /\d*?4/ là. Bắt đầu là số \d. Có Không hoặc Nhiều * số lên tiếp nhau. Chế độ lười biến *? mỗi lần chạy sẽ nhìn về trước hỏi có phải là số 4 không.

Đó là theo ý của mình nhé các bạn. Đơn nhiên mỗi người sẽ có mỗi cách hiểu khác nhàu. Cái này là tùy.

Bình thường khi không có chế độ lười biến *? thì * sẽ cố gắng tiêu thụ càng nhiều \d càng tốt.

Ví dụ:

Khi không có chế độ lười biến *?

  • Trận đấu /\d*/
1let str = "0123456789";
2
3let reg = /\d*/; // Bỏ ?4
4
5let ketQua = str.match(reg);
6
7console.log(ketQua); // ['0123456789', index: 0, input: '0123456789', groups: undefined]

Ở ví dụ trên mình đả bỏ ?4 đi. Bây giờ trận đấu chỉ còn /\d*/. Lúc này định lượng * sẽ tiêu thụ nhiều số nhất có thể. Đến khi nào gặp ký tự không phải số \D thì mới dùng lại.

1// 0123456789
2// **********
3// \d .... \d

Như các bạn có thể thấy. Chuỗi nguồn của chúng ta có từ 0 đến 9. Thì cứ mỗi cái \d chính là tương ứng với 1 cái định lượng *

Nếu bây giờ chúng ta thêm chế độ lười biến mà không thêm ký tự gì sau nữa. Thì xem điều gì sẻ xãy ra.

Khi có chế độ lười biến *?

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

Bây giờ đầu ra là chuỗi rỗng "". Hành vi này là do định lượng * gây ra. Nếu chúng ta đổi * thành + thì kết quả sẽ khác.

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

Bây giờ đầu ra đã khác. Chúng ta cùng nhau đổi trận đấu lại nào.

  • Trận đấu /\d*?4/

Trận đấu này mình đã giải thích ý nghĩa ở trên đầu bài rồi nhé. Nên chúng ta chỉ cần xem ví dụ và xem đầu ra của nó thôi.

1let str = "0123456789";
2
3let reg = /\d*?4/; 
4
5let ketQua = str.match(reg);
6
7console.log(ketQua); // ['01234', index: 0, input: '0123456789', groups: undefined]

Khi có chế độ lười biến thì hành vi của *, +, ? sẽ thay đổi.

  • *? Chế độ lười biến dành cho Không hoặc Nhiều
  • +? Chế độ lười biến dành cho Một hoặc Nhiều
  • ?? Chế độ lười biến dành cho Không hoặc Một

Bây giờ hành vi của trận đấu /\d+?4/ nó sẽ thay đổi. Thay vì lấy nhiều số nhất có thể. Thì mỗi lần lấy nó lại nhìn về trước xem đó có phải là số 4 không.

1// 0123456789
2// \d*?4 => 0\d*?4
3// 0\d*?4 => 01\d*?4
4// 01\d*?4 => 012\d*?4
5// 012\d*?4 => 0123\d*?4
6// 0123\d*?4 => 01234
7// 01234

Cách chạy thì nó như vậy. Nếu các bạn thấy chưa hiểu thì mình viết chức năng cho bạn xem.

1let str = "0123456789";
2function demoCheDoLuoiBien(str, kyTu) {
3    let ketQua = "";
4    for (let i = 0; i < str.length; i++) {
5        ketQua += str[i];
6        let nhinTruoc = str[i + 1]; // Nhìn về trước 1 bước
7        if (nhinTruoc === kyTu) {
8            return ketQua + nhinTruoc;
9        }
10    }
11    return ketQua;
12}
13
14console.log(demoCheDoLuoiBien(str, "4")); // "01234"

Đơn nhiên là mình chỉ demo cho bạn biết về nhìn trước nó như thế nào thôi. Chứ ví dụ của mình không phải là cách mà trận đấu /\d+?4/ mà chúng ta đang chạy đâu nhé. Nó rất rất là nhiều thứ cần phải làm nữa lắm.

  • Trận đấu /\d??4/

Ý nghĩa của trận đấu /\d??4/này là. Bắt đầu bằng Không hoặc Một số \d. Tiếp theo là số 4. Nếu trùng thì trả về.

Khớp với: 4 \d4. \d ở đây là bất kỳ số từ 0 đến 9.

1let str = "0123456789";
2
3let reg = /\d??4/; 
4
5let ketQua = str.match(reg);
6
7console.log(ketQua); // ['34', index: 3, input: '0123456789', groups: undefined]

Bây giờ chúng ta đi xem cách nó chạy khi có cờ g nhé.

  • Trận đấu /\d??4/g

Ý nghĩa của trận đấu /\d??4/này là. Bắt đầu bằng Không hoặc Một số \d. Tiếp theo là số 4. Tìm đến hết chuỗi.

1let str = "0123456789 4 54";
2
3let reg = /\d??4/g; 
4
5let ketQua = str.match(reg);
6
7console.log(ketQua); // ['34', '4', '54']
  • Trận đấu /\d*?4/g

Ý nghĩa của trận đấu /\d*?4/này là. Bắt đầu bằng Không hoặc Nhiều số \d. Tiếp theo là số 4. Tìm đến hết chuỗi.

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

Ý nghĩa của trận đấu /\d+?4/này là. Bắt đầu bằng Một hoặc Nhiều số \d. Tiếp theo là số 4. Tìm đến hết chuỗi.

1let str = "0123456789 4 54";
2
3let reg = /\d+?4/g; 
4
5let ketQua = str.match(reg);
6
7console.log(ketQua); // ['01234', '54']

Ngoài ra còn có các trận đấu khác.

Các trận đấu dưới đây cũng có ý nghĩa tương đương các ví dụ trên

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

Ví dụ:

  • Trận đấu /\d{0,1}?4/g
1let str = "0123456789 4 54";
2
3let reg = /\d{0,1}?4/g; 
4
5let ketQua = str.match(reg);
6
7console.log(ketQua); // ['34', '4', '54']
  • Trận đấu /\d{0,}?4/g
1let str = "0123456789 4 54";
2
3let reg = /\d{0,}?4/g; 
4
5let ketQua = str.match(reg);
6
7console.log(ketQua); // ['01234', '4', '54']
  • Trận đấu /\d{1,}?4/g
1let str = "0123456789 4 54";
2
3let reg = /\d{1,}?4/g; 
4
5let ketQua = str.match(reg);
6
7console.log(ketQua); // ['01234', '54']

Tổng kết

Trong bài viết này mình đã hướng dẫn các bạn về chế độ lười biến. Nó chỉ có tác dụng với /*?/ /+?/ /??/ {0,}? {1,}? {0,1}? {x,y}? đơn nhiên là còn nhiều thứ khác nữa.

Nếu mà thấy nó /?/ nó đứng một mình thì chỉ có một ý nghĩa duy nhất là Không hoặc Một

OK. hẹn gặp bạn ở bài sau nhé.

  • biểu thức
  • string
  • lười biến
  • tham lam
  • regexp
  • object
  • chuỗi

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