Bu kesinlikle çok fazla tuzağı olan bir şey. Paolo Bergantino'nun cevabıyla çalışıyordum ve bunun bile bazı sınırlamaları olduğunu fark ettim. Tarihlerin dizgi temsilleriyle çalışmayı ana problemlerin bazılarını hızlıca bulmak için iyi bir yer buldum. Bunun gibi bir giriş dizesiyle başlayın:
'12-2-2019 5:1:48.670'
ve Paolo'nun işlevini şu şekilde ayarlayın:
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;
}
Normal ifadenin iletilmesini istedim, böylece işlev daha yeniden kullanılabilir olsun, ikincisi, parametrenin bir dize olmasını istedim, böylece istemcinin normal ifadeyi yapması gerekmez, sadece dizeyle eşleşir, örneğin standart bir dize yardımcı programı sınıfı yöntemi.
Şimdi, burada girdiyle ilgili sorunlarla uğraştığımı görebilirsiniz. Takip ederek:
if (typeof re !== "string") {
return 0;
}
Ben girdi değişmezi gibi bir şey değil sağlanması ediyorum 0, false, undefined, veya null, hiçbiri dizeleri olmak üzere. Bu değişmez değerler girdi dizesinde olmadığından, eşleşme olmamalıdır, ancak eşleşmelidir '0', bu bir dizedir.
Takip ederek:
re = (re === '.') ? ('\\' + re) : re;
RegExp yapıcısının dizeyi '.'tüm karakter eşleştirici olarak yorumlayacağı gerçeğiyle uğraşıyorum (sanırım yanlış bir şekilde)\.\
Son olarak, RegExp yapıcısını kullandığım için 'g', diğer gönderilerdeki önerilere benzer şekilde yalnızca ilkini değil, tüm eşleşmeleri sayması için ona genel bayrağı vermem gerekiyor .
Bunun son derece geç bir cevap olduğunun farkındayım, ama burada tökezleyen birine yardımcı olabilir. BTW işte TypeScript sürümü:
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;
}