Questo è certamente qualcosa che ha molte trappole. Stavo lavorando con la risposta di Paolo Bergantino e mi sono reso conto che anche quella ha dei limiti. Ho trovato che lavorare con le rappresentazioni di stringa delle date è un buon posto per trovare rapidamente alcuni dei problemi principali. Inizia con una stringa di input come questa:
'12-2-2019 5:1:48.670'
e impostare la funzione di Paolo in questo modo:
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;
}
Volevo che fosse passata l'espressione regolare, in modo che la funzione fosse più riutilizzabile, in secondo luogo, volevo che il parametro fosse una stringa, in modo che il client non dovesse creare la regex, ma semplicemente corrispondere sulla stringa, come un metodo di classe di utilità stringa standard.
Ora, qui puoi vedere che ho a che fare con problemi con l'input. Con quanto segue:
if (typeof re !== "string") {
return 0;
}
Sto assicurando che l'ingresso non è nulla di simile letterale 0, false, undefined, o null, nessuno dei quali sono stringhe. Poiché questi letterali non sono nella stringa di input, non dovrebbero esserci corrispondenze, ma dovrebbe corrispondere '0', che è una stringa.
Con quanto segue:
re = (re === '.') ? ('\\' + re) : re;
Ho a che fare con il fatto che il costruttore RegExp interpreterà (credo, a torto) la stringa '.'come il combinatore di tutti i caratteri\.\
Infine, poiché sto utilizzando il costruttore RegExp, devo assegnargli il 'g'flag globale in modo che conti tutte le corrispondenze, non solo la prima, in modo simile ai suggerimenti in altri post.
Mi rendo conto che questa è una risposta estremamente tardiva, ma potrebbe essere utile a qualcuno che inciampa qui. A proposito, ecco la versione 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;
}