Isso certamente é algo que tem muitas armadilhas. Eu estava trabalhando com a resposta de Paolo Bergantino, e percebendo que mesmo isso tem algumas limitações. Achei que trabalhar com representações de strings de datas é um bom lugar para encontrar rapidamente alguns dos principais problemas. Comece com uma string de entrada como esta:
'12-2-2019 5:1:48.670'
e configurar a função de Paolo assim:
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;
}
Eu queria que a expressão regular fosse passada, para que a função fosse mais reutilizável, em segundo lugar, eu queria que o parâmetro fosse uma string, para que o cliente não tivesse que fazer a regex, mas simplesmente corresponder na string, como um método de classe de utilitário de string padrão.
Agora, aqui você pode ver que estou lidando com problemas com a entrada. Com o seguinte:
if (typeof re !== "string") {
return 0;
}
Eu estou garantindo que a entrada não é nada parecido com o literal 0, false, undefined, ou null, nenhum dos quais são strings. Como esses literais não estão na string de entrada, não deve haver correspondências, mas deve haver correspondência '0', que é uma string.
Com o seguinte:
re = (re === '.') ? ('\\' + re) : re;
Estou lidando com o fato de que o construtor RegExp irá (eu acho, erroneamente) interpretar a string '.'como o combinador de todos os caracteres\.\
Finalmente, como estou usando o construtor RegExp, preciso dar a ele o 'g'sinalizador global para que conte todas as correspondências, não apenas a primeira, semelhante às sugestões em outras postagens.
Sei que essa é uma resposta extremamente tardia, mas pode ser útil para alguém que está tropeçando aqui. BTW, aqui está a versão do 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;
}