Ini tentunya sesuatu yang memiliki banyak jebakan. Saya bekerja dengan jawaban Paolo Bergantino, dan menyadari bahwa itu pun memiliki beberapa keterbatasan. Saya menemukan bekerja dengan representasi string dari tanggal sebagai tempat yang baik untuk segera menemukan beberapa masalah utama. Mulailah dengan string input seperti ini:
'12-2-2019 5:1:48.670'
dan mengatur fungsi Paolo seperti ini:
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;
}
Saya ingin ekspresi reguler diteruskan, sehingga fungsinya lebih dapat digunakan kembali, kedua, saya ingin parameter menjadi string, sehingga klien tidak harus membuat regex, tetapi cukup mencocokkan string, seperti metode kelas utilitas string standar.
Sekarang, di sini Anda dapat melihat bahwa saya berurusan dengan masalah dengan input. Dengan berikut ini:
if (typeof re !== "string") {
return 0;
}
Saya memastikan bahwa input tidak apa-apa seperti literal 0
, false
, undefined
, atau null
, tidak ada yang string. Karena literal ini tidak ada dalam string masukan, tidak boleh ada kecocokan, tetapi harus cocok '0'
, yaitu string.
Dengan berikut ini:
re = (re === '.') ? ('\\' + re) : re;
Saya berurusan dengan fakta bahwa konstruktor RegExp akan (menurut saya, salah) menafsirkan string '.'
sebagai semua pencocokan karakter\.\
Akhirnya, karena saya menggunakan konstruktor RegExp, saya perlu memberinya 'g'
bendera global sehingga menghitung semua kecocokan, bukan hanya yang pertama, mirip dengan saran di posting lain.
Saya menyadari bahwa ini adalah jawaban yang sangat terlambat, tetapi mungkin bermanfaat bagi seseorang yang tersandung di sini. BTW inilah versi 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;
}