👽 Lớp Ký Tự Đặc Biệt 👽

Lớp ký tự đặc biệt trong chuỗi string và regexp

Để làm việc với chuỗi stringregexp một cách hoàn hảo và mạnh mẽ. Các bạn bắt buộc phải hiểu về nó.
js_masterRegular
Regular-Expression-trong-JavaScript.jpg

Trong chuỗi có rất nhiều ký tự đặt biệt. Nó đại diện cho một lớp nhất định. Chúng ta cùng nhau tìm hiểu về nó nhé.

Lớp ký tự

Để hoạt động cũng như thao tác chuỗi một cách hoàn hảo thì điều bắt buộc các bạn phải biết tất cả các ký tự đặt biệt này.

.

Định lượng chấm .

Vì ký tự dấu chấm . dễ bị hiểu nhầm là kết thúc câu khi chúng ta viết bài. Nên mình viết ra cho bản hiểu. Tránh hiểu nhầm.

Ký tựMô tả
.Dấu chấm . ở đây có ý nghĩa phù hợp với bất kỳ ký tự nào ngoại trừ một dòng mới \n \r \u2028 \u2029 /.y/. Các cờ cũng thay đổi hành vi tìm kiếm của nó. Các bạn mới học thì cũng cần phải có thời gian mới nhớ hết được. Nó nhiều thứ lắm.

Ví dụ:

1let str = "Hồ Quang \nTrí";
2
3let ketQua = str.match(/.+/);
4
5console.log(ketQua); // ['Hồ Quang ', index: 0, input: 'Hồ Quang \r Trí', groups: undefined]
  1. /.+/ Ở đây chính là đối tượng regexp. Nó có 2 ý nghĩa.
    • . Dấu chấm ý nghĩa như mô tả ở trên.
    • + Dấu cộng ý nghĩa là một hoặc nhiều.
    • Gộp cả hai lại chúng ta có. Bất kể ký tự nào một hoặc nhiều cũng được nhưng đến khi gặp \n \r \u2028 \u2029 thì dừng lại. Và trả kết quả về.

Nếu chuỗi mà trống thì trận đấu /.+/ sẽ trả về null.

1let str = "";
2
3let ketQua = str.match(/.+/);
4
5console.log(ketQua); // null

Như mô tả ở trên các cờ cũng thay đổi hành vi của nó. Nếu các bạn chưa biết thì xem Regexp. Nhưng trong ví dụ này mình chỉ nói đến cờ s

Nếu có cờ s thì hành vi ký tự đặt biệt dấu chấm . sẽ thay đổi.

1let str = "Hồ Quang \n Trí";
2
3let ketQua = str.match(/.+/s);
4
5console.log(ketQua); // ['Hồ Quang \n Trí', index: 0, input: 'Hồ Quang \n Trí', groups: undefined]

Đơn nhiên nếu có thêm cờ g nữa thì đầu ra bây giờ lại thay đổi.

1let str = "Hồ Quang \n Trí";
2
3let ketQua = str.match(/.+/sg);
4
5console.log(ketQua); // ['Hồ Quang \n Trí']

Tất cả ví dụ trên mình sử dụng phương pháp match() nhé các bạn. Nếu các bạn sử dụng phương pháp khác nữa thì đơn nhiên đầu ra cũng sẽ khác. Tùy vào cách bạn sài.

\d

Lớp ký tự đặc biệt \d

Ký tựMô tả
\dKhớp với bất kỳ chữ số nào. Tương đương với /[0-9]/. Các cờ cũng thay đổi hành vi tìm kiếm của trận đấu.

Ví dụ:

Không có cờ

1let str = "Hồ Quang 301\nTrí năm 2021";
2
3let ketQua = str.match(/\d/);
4
5console.log(ketQua); // ['3', index: 9, input: 'Hồ Quang 301\nTrí năm 2021', groups: undefined]

Có cờ g

1let str = "Hồ Quang 301\nTrí năm 2021";
2
3let ketQua = str.match(/\d/g);
4
5console.log(ketQua); // ['3', '0', '1', '2', '0', '2', '1']

Có cờ m

1let str = "Hồ Quang 301\nTrí năm 2021";
2
3let ketQua = str.match(/\d/m);
4
5console.log(ketQua); // ['3', index: 9, input: 'Hồ Quang 301\nTrí năm 2021', groups: undefined]

Có 2 cờ gm

1let str = "Hồ Quang 301\nTrí năm 2021";
2
3let ketQua = str.match(/\d/gm);
4
5console.log(ketQua); // ['3', '0', '1', '2', '0', '2', '1']

Ngoài ra còn nhiều thứ khác nữa. Mình sẽ viết bài giải thích từ từ. Nó nhiều thứ lắm

1let str = "Hồ 231 Quang 301\nTrí năm 2021";
2
3let ketQua = str.match(/\d+$/gm);
4
5console.log(ketQua); // ['301', '2021']
  1. /\d+$/gm Trận đấu này có rất nhiều ý nghĩa
    • \d Là như mô tả ở trên
    • + Là một hoặc nhiều
    • $ Kết thúc chuỗi. Thường là \n
    • g Chạy hết tất cả chuỗi
    • m Chế độ đa dòng. Như ví dụ trên. Chuỗi str đó có 2 dòng

Ý Nghĩa. Tìm một hoặc nhiều số mà số đó nằm ở kết thúc của một dòng. Chạy hết tất cả các dòng của chuỗi nguồn.

Đó là theo cách mình hiểu. Cũng tùy vào ý nghĩ của mỗi người.

\D

Lớp ký tự đặc biệt \D

Ký tựMô tả
\DKhớp với bất kỳ ký tự nào không phải là chữ số. Tương đương với /[^0-9]/
  • /[^0-9]/ Có ý nghĩa là
    • [] Ký tự đặt biệt. Dùng để khớp với bất kỳ ký tự trong dấu ngoặc vuông đó.
    • ^ Nếu nó ở đầu của dấu [^...] thì có ý nghĩa loại trừ tất cả các ký tự trong dấu ngoặc vuông đó.

Ở giải thích ý nghĩa trên mình chỉ mới nói sơ qua cho bạn hình dung thôi. Rồi mình cũng sẽ viết về nó. Nó có nhiều cái hay lắm.

Ví dụ:

Không có cờ

1let str = "Hồ 231 Quang 301\nTrí năm 2021";
2
3let ketQua = str.match(/\D/);
4
5console.log(ketQua); // ['H', index: 0, input: 'Hồ 231 Quang 301\nTrí năm 2021', groups: undefined]

Có cờ g

1let str = "Hồ 231 Quang 301\nTrí năm 2021";
2
3let ketQua = str.match(/\D/g);
4
5console.log(ketQua); // ['H', 'ồ', ' ', ' ', 'Q', 'u', 'a', 'n', 'g', ' ', '\n', 'T', 'r', 'í', ' ', 'n', 'ă', 'm', ' ']

Ngoài ra còn nhiều cờ khác ảnh hưởng đến kết quả của trận đấu lắm. Còn ý nghĩa thật sự của nó thì như mô tả ở trên.

\w

Lớp ký tự đặc biệt \w

Ký tựMô tả
\wKhớp với bất kỳ ký tự chữ số nào từ bảng chữ cái bao gồm cả dấu gạch dưới. Tương đương với /[A-Za-z0-9_]/

Ví dụ:

Không có cờ

1let str = "Hồ 231 Quang 301\nTrí năm 2021 + @ _";
2
3let ketQua = str.match(/\w/);
4
5console.log(ketQua); // ['H', index: 0, input: 'Hồ 231 Quang 301\nTrí năm 2021 + @ _', groups: undefined]

Có cờ g

1let str = "Hồ 231 Quang 301\nTrí năm 2021 + @ _";
2
3let ketQua = str.match(/\w/g);
4
5console.log(ketQua); // ['H', '2', '3', '1', 'Q', 'u', 'a', 'n', 'g', '3', '0', '1', 'T', 'r', 'n', 'm', '2', '0', '2', '1', '_']

Các bạn để ý đầu ra nhé. Không có ký tự ngôn ngữ Việt Nam mình xuất hiện trong đầu ra. Nó chỉ ra đúng kết quả tất cả ký tự /[A-Za-z0-9_]/ như mô tả.

Đơn nhiên về sau các bạn sẽ biết cách thôi. Đối tượng Regexp là trùm thao tác và làm việc với chuỗi mà. Nó mà còn không làm được thì còn ai làm được bây giờ 😂.

\W

Lớp ký tự đặt biệt \W

Ký tựMô tả
\WKhớp với bất kỳ ký tự nào không phải là ký tự từ từ bảng chữ cái Latinh cơ bản. Tương đương với /[^A-Za-z0-9_]/

Ví dụ:

Không có cờ

1let str = "Hồ 231 Quang 301\nTrí năm 2021 + @ _";
2
3let ketQua = str.match(/\W/);
4
5console.log(ketQua); // ['ồ', index: 1, input: 'Hồ 231 Quang 301\nTrí năm 2021 + @ _', groups: undefined]

Có cờ g

1let str = "Hồ 231 Quang 301\nTrí năm 2021 + @ _";
2
3let ketQua = str.match(/\W/g);
4
5console.log(ketQua); // ['ồ', ' ', ' ', ' ', '\n', 'í', ' ', 'ă', ' ', ' ', '+', ' ', '@', ' ']

\s

Lớp ký tự đặc biệt \s

Ký tựMô tả
\sKhớp với một ký tự khoảng trắng. Tương đương với \f \n \r \t \v \u00a0 \u1680 \u2000- \u200a \u2028 \u2029 \u202f \u205f \u3000 \ufeff

Một danh sách quá dài phải ko các bạn. Đơn nhiên chúng ta cũng không cần nhớ nhiều làm gì cho mệt. Chỉ cần nhớ lớp \s là 1 ký tự khoảng trắng là đủ sài rồi. Đơn nhiên tùy bài toán mà áp dụng.

Ví dụ:

Không có cờ

1let str = "Hồ 231 Quang 301\nTrí năm 2021 + @ _";
2
3let ketQua = str.match(/\s/);
4
5console.log(ketQua); // [' ', index: 2, input: 'Hồ 231 Quang 301\nTrí năm 2021 + @ _', groups: undefined]

Có cờ g

1let str = "Hồ 231 Quang 301\nTrí năm 2021 + @ _";
2
3let ketQua = str.match(/\s/g);
4
5console.log(ketQua); // [' ', ' ', ' ', '\n', ' ', ' ', ' ', ' ', ' ']

\S

Lớp ký tự đặc biệt \S

Ký tựMô tả
\SPhù hợp với một nhân vật duy nhất khác với không gian trắng. Tương đương với /[^\s]/

Ví dụ:

Không có cờ

1let str = "Hồ 231 Quang 301\nTrí năm 2021 + @ _";
2
3let ketQua = str.match(/[^\s]/);
4
5console.log(ketQua); // ['H', index: 0, input: 'Hồ 231 Quang 301\nTrí năm 2021 + @ _', groups: undefined]

Có cờ g

1let str = "Hồ 231 Quang 301\nTrí năm 2021 + @ _";
2
3let ketQua = str.match(/[^\s]/g);
4
5console.log(ketQua); // ['H', 'ồ', '2', '3', '1', 'Q', 'u', 'a', 'n', 'g', '3', '0', '1', 'T', 'r', 'í', 'n', 'ă', 'm', '2', '0', '2', '1', '+', '@', '_']

\

Ký tự đặt biệt \

Ký tựMô tả
\Dùng để thoát khỏi ký tự đặc biệt.

Trong chuỗi và đối tượng regexp có rất rất là nhiều lớp ký tự đặt biệt. Như tất cả các thứ chúng ta đang học ở trên \s \d ...

Ví dụ:

Không có thoát \

1let str = "Hồ quang Trí \\d aa";
2
3console.log(str); // Hồ quang Trí \d aa
4
5let ketQua = str.match(/\d/);
6
7console.log(ketQua); // null

Nếu không có thoát \ thì ý nghĩa trận đấu /\d/ là một số [0-9]

Có thoát \

1let str = "Hồ quang Trí \\d aa";
2
3console.log(str); // Hồ quang Trí \d aa
4
5let ketQua = str.match(/\\d/);
6
7console.log(ketQua); // ['\\d', index: 13, input: 'Hồ quang Trí \\d aa', groups: undefined]

Nếu có thoát \ thì ý nghĩa /\\d/ bây giờ là chuỗi \d

Nó cũng tương tương với các lớp ký tự đặc biệt khác. Và trong regexp cũng có ký tự đặc biệt nữa và chúng ta cũng cần phải thoát \ khỏi nó.

Ví dụ: [].+()?|/\*^$ trước mắt là vậy còn nữa mà mình quên hay sao ấy

Ngoài ra còn có nhiều lớp ký tự khác nữa. Nhưng mình cũng hiếm khi dùng. Nên mình chỉ liệt kê ra các lớp mà chúng ta nên nhớ thôi. Nó rất quan trọng

Tổng kết

Trong bài viết này mình đã nói qua các lớp ký tự đặt biệt và có giải thích ý nghĩa của nó.

Câu hỏi đặc ra bây giờ làm sao để nhớ hết nó. Cái này bạn có thể học thuộc nó. Hoặc chỉ cần thời gian tự động nhớ. Nó rất có ích cho các bạn sau này. Cái này quan trọng lắm.

  • lớp
  • ký tự đặc biệt
  • biểu thức
  • regexp
  • string
  • mảng

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