Đây chắc chắn là một thứ có rất nhiều cạm bẫy. Tôi đã làm việc với câu trả lời của Paolo Bergantino và nhận ra rằng ngay cả câu trả lời đó cũng có một số hạn chế. Tôi thấy làm việc với các biểu diễn chuỗi ngày là một nơi tốt để nhanh chóng tìm ra một số vấn đề chính. Bắt đầu với một chuỗi đầu vào như sau:
'12-2-2019 5:1:48.670'
và thiết lập chức năng của Paolo như sau:
function count(re, str) {
if (typeof re !== "string") {
return 0;
}
re = (re === '.') ? ('\\' + re) : re;
var cre = new RegExp(re, 'g');
return ((str || '').match(cre) || []).length;
}
Tôi muốn biểu thức chính quy được truyền vào, để hàm có thể sử dụng lại nhiều hơn, thứ hai, tôi muốn tham số là một chuỗi, để khách hàng không phải tạo regex, mà chỉ cần khớp trên chuỗi, như một phương thức lớp tiện ích chuỗi tiêu chuẩn.
Bây giờ, ở đây bạn có thể thấy rằng tôi đang giải quyết các vấn đề với đầu vào. Với những điều sau đây:
if (typeof re !== "string") {
return 0;
}
Tôi đảm bảo rằng các đầu vào không phải là bất cứ điều gì giống như đen 0
, false
, undefined
, hay null
, không ai trong số đó là chuỗi. Vì những ký tự này không có trong chuỗi đầu vào, nên không có kết quả phù hợp, nhưng nó phải khớp '0'
, đó là một chuỗi.
Với những điều sau đây:
re = (re === '.') ? ('\\' + re) : re;
Tôi đang giải quyết thực tế là hàm tạo RegExp sẽ (tôi nghĩ là sai) diễn giải chuỗi '.'
là trình khớp tất cả các ký tự\.\
Cuối cùng, vì tôi đang sử dụng hàm tạo RegExp, tôi cần đặt 'g'
cờ toàn cục cho nó để nó đếm tất cả các kết quả phù hợp, không chỉ kết quả đầu tiên, tương tự như các đề xuất trong các bài viết khác.
Tôi nhận ra rằng đây là một câu trả lời cực kỳ muộn, nhưng nó có thể hữu ích cho ai đó đang vấp phải ở đây. BTW đây là phiên bản TypeScript:
function count(re: string, str: string): number {
if (typeof re !== 'string') {
return 0;
}
re = (re === '.') ? ('\\' + re) : re;
const cre = new RegExp(re, 'g');
return ((str || '').match(cre) || []).length;
}