C'est certainement quelque chose qui a beaucoup de pièges. Je travaillais avec la réponse de Paolo Bergantino et je me rendais compte que même cela a des limites. J'ai trouvé que travailler avec des représentations sous forme de chaîne de dates était un bon endroit pour trouver rapidement certains des principaux problèmes. Commencez par une chaîne d'entrée comme celle-ci:
'12-2-2019 5:1:48.670'
et configurez la fonction de Paolo comme ceci:
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;
}
Je voulais que l'expression régulière soit transmise, afin que la fonction soit plus réutilisable, deuxièmement, je voulais que le paramètre soit une chaîne, afin que le client n'ait pas à créer l'expression régulière, mais simplement correspondre à la chaîne, comme une méthode de classe utilitaire de chaîne standard.
Maintenant, vous pouvez voir ici que je traite des problèmes avec l'entrée. Avec ce qui suit:
if (typeof re !== "string") {
return 0;
}
Je me assure que l'entrée est rien comme le littéral 0
, false
, undefined
ou null
, dont aucun ne sont des chaînes. Étant donné que ces littéraux ne sont pas dans la chaîne d'entrée, il ne devrait y avoir aucune correspondance, mais cela devrait correspondre '0'
, qui est une chaîne.
Avec ce qui suit:
re = (re === '.') ? ('\\' + re) : re;
Je traite du fait que le constructeur RegExp interprètera (je pense, à tort) la chaîne '.'
comme la correspondance de tous les caractères\.\
Enfin, parce que j'utilise le constructeur RegExp, je dois lui donner le 'g'
drapeau global pour qu'il compte toutes les correspondances, pas seulement la première, similaire aux suggestions d'autres articles.
Je me rends compte que c'est une réponse extrêmement tardive, mais cela pourrait être utile à quelqu'un qui trébuche ici. BTW voici la version 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;
}