Sin duda, esto es algo que tiene muchas trampas. Estaba trabajando con la respuesta de Paolo Bergantino y me di cuenta de que incluso eso tiene algunas limitaciones. Trabajar con representaciones de cadenas de fechas me pareció un buen lugar para encontrar rápidamente algunos de los problemas principales. Comience con una cadena de entrada como esta:
'12-2-2019 5:1:48.670'
y configura la función de Paolo así:
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;
}
Quería que se pasara la expresión regular, para que la función sea más reutilizable, en segundo lugar, quería que el parámetro fuera una cadena, para que el cliente no tenga que hacer la expresión regular, sino que simplemente coincida con la cadena, como un método de clase de utilidad de cadena estándar.
Ahora, aquí puede ver que estoy lidiando con problemas con la entrada. Con lo siguiente:
if (typeof re !== "string") {
return 0;
}
Estoy asegurando que la entrada no es nada parecido a lo literal 0
, false
, undefined
, o null
, ninguno de los cuales son cadenas. Dado que estos literales no están en la cadena de entrada, no debería haber coincidencias, pero debería coincidir '0'
, que es una cadena.
Con lo siguiente:
re = (re === '.') ? ('\\' + re) : re;
Estoy lidiando con el hecho de que el constructor de RegExp interpretará (creo que incorrectamente) la cadena '.'
como el coincidente de todos los caracteres\.\
Finalmente, debido a que estoy usando el constructor RegExp, necesito darle la 'g'
bandera global para que cuente todas las coincidencias, no solo la primera, similar a las sugerencias en otras publicaciones.
Me doy cuenta de que esta es una respuesta extremadamente tardía, pero podría ser útil para alguien que se tropieza por aquí. Por cierto, aquí está la versión de 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;
}