tl; dr: Penghitung Pola Umum
// THIS IS WHAT YOU NEED
const count = (str) => {
const re = /YOUR_PATTERN_HERE/g
return ((str || '').match(re) || []).length
}
Bagi mereka yang tiba di sini mencari cara umum untuk menghitung jumlah kemunculan pola regex dalam sebuah string, dan tidak ingin gagal jika tidak ada kemunculan nol, kode inilah yang Anda butuhkan. Berikut peragaannya:
/*
* Example
*/
const count = (str) => {
const re = /[a-z]{3}/g
return ((str || '').match(re) || []).length
}
const str1 = 'abc, def, ghi'
const str2 = 'ABC, DEF, GHI'
console.log(`'${str1}' has ${count(str1)} occurrences of pattern '/[a-z]{3}/g'`)
console.log(`'${str2}' has ${count(str2)} occurrences of pattern '/[a-z]{3}/g'`)
Jawaban Asli
Masalah dengan kode awal Anda adalah Anda kehilangan pengenal global :
>>> 'hi there how are you'.match(/\s/g).length;
4
Tanpa g
bagian dari regex, ini hanya akan cocok dengan kemunculan pertama dan berhenti di situ.
Perhatikan juga bahwa regex Anda akan menghitung spasi berturut-turut dua kali:
>>> 'hi there'.match(/\s/g).length;
2
Jika itu tidak diinginkan, Anda dapat melakukan ini:
>>> 'hi there'.match(/\s+/g).length;
1
var result = text.match(/\s/g); return result ? result.length : 0;
( str.match(...) || [] ).length
Seperti yang disebutkan dalam jawaban saya sebelumnya , Anda dapat menggunakan
RegExp.exec()
untuk mengulang semua kecocokan dan menghitung setiap kemunculan; keuntungannya terbatas pada memori saja, karena secara keseluruhan ini sekitar 20% lebih lambat daripada penggunaanString.match()
.sumber
Berdasarkan https://stackoverflow.com/a/48195124/16777 tetapi diperbaiki agar benar-benar berfungsi dalam kasus tanpa hasil.
sumber
('my string'.match(/\s/g) || []).length;
sumber
|| []
di tempat yang salah, seharusnya('my string'.match(/\s/g) || []).length
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:
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:
Saya memastikan bahwa input tidak apa-apa seperti literal
0
,false
,undefined
, ataunull
, 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:
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:
sumber
bagaimana kalau seperti ini
sumber