Đếm từ chính xác cần xử lý: khoảng trắng đầu/cuối, nhiều khoảng trắng liên tiếp, xuống dòng, tab.
Các bước chuẩn hóa
- Xóa khoảng trắng đầu/cuối:
str.replace(/^\s+|\s+$/g, '')hoặcstr.trim(). - Thay nhiều khoảng trắng liên tiếp bằng 1:
str.replace(/\s+/g, ' '). - Xử lý xuống dòng có khoảng trắng:
str.replace(/\n\s+/g, '\n'). - Split bằng khoảng trắng và đếm length.
Code hoàn chỉnh (cách gốc)
<script>
function demTu(str) {
if (typeof str !== 'string') return 0;
str = str.trim(); // B1
str = str.replace(/\s+/g, ' '); // B2: nhiều space/tab/newline → 1 space
if (str === '') return 0; // Chuỗi rỗng sau trim
return str.split(' ').length; // B4
}
document.write(demTu(" Tutorix is one of the best E-learning platforms ")); // 8
</script>
Kết quả
8
Cách hiện đại (ES6+) — Gọn hơn
function demTuModern(str) {
if (typeof str !== 'string') return 0;
// match tất cả chuỗi ký tự không phải whitespace
return (str.match(/\S+/g) || []).length;
}
// \S = non-whitespace, g = global
// match() trả về null nếu không khớp → || [] tránh lỗi
Test
demTuModern(" Hello world "); // 2
demTuModern(""); // 0
demTuModern("One\nTwo\tThree"); // 3
So sánh
| Phương pháp | Ưu điểm | Nhược điểm |
|---|---|---|
| Split sau replace | Dễ hiểu, kiểm soát từng bước | Code dài, nhiều bước |
| Regex match(/\S+/g) | Ngắn, nhanh, chuẩn Unicode | Ít trực quan cho người mới |
Lưu ý
- Từ được định nghĩa là chuỗi ký tự không chứa whitespace.
- Dấu câu (.,!?) được tính là một phần của từ — nếu cần tách dấu câu, regex phức tạp hơn.
- Hỗ trợ tiếng Việt:
/\S+/gvẫn hoạt động tốt với Unicode.