Lớp ký tự đặc biệt trong chuỗi string và regexp
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.
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]
- /.+/ Ở đâ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
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']
- /\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
- /[^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
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
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
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
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 \
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
Các bài viết liên quan
Các phương pháp và tài sản của lớp String
Chúng ta cùng tìm hiểu qua các phương pháp và tài sản của lớp String nhé.JavascriptPhương pháp lặp Symbol.iterator
Phương pháp lặp [Symbol.iterator]() là gì?. Cùng nhau tìm hiểu cách thức hoạt động của nó.JavascriptCác phương pháp tỉnh Object.keys values entries
Cùng nhau tìm hiểu về các phương pháp tỉnh Object.keys() Object.values() Object.entries()JavascriptBiểu thức chính quy Regular trong javascript
Đối tượng Regexp cung cấp các phương pháp mạnh mẽ để tìm kiếm và thay thế văn bản trong jsvascriptRegular