Así que básicamente me escribió a mí mismo esta función con el fin de ser capaz de contar el número de ocurrencias de una subcadena en una cadena:Cambiar las banderas RegExp
String.prototype.numberOf = function(needle) {
var num = 0,
lastIndex = 0;
if(typeof needle === "string" || needle instanceof String) {
while((lastIndex = this.indexOf(needle, lastIndex) + 1) > 0)
{num++;} return num;
} else if(needle instanceof RegExp) {
// needle.global = true;
return this.match(needle).length;
} return 0;
};
El método en sí mismo lleva a cabo bastante bien y tanto la expresión regular y Las búsquedas basadas en cadenas son bastante comparables en cuanto al tiempo de ejecución (tanto ~ 2ms en todo el amplio "451 Fahrenheit" de Ray Bradbury buscando todos los "s").
Lo que me molesta, sin embargo, es la imposibilidad de cambiar el indicador de la instancia RegExp suministrada. No tiene sentido llamar al String.prototype.match en esta función sin que el indicador global de la Expresión regular suministrado se establezca en verdadero, ya que solo notará la primera aparición luego. Sin duda, podría establecer el indicador manualmente en cada RegExp pasado a la función, sin embargo, preferiría poder clonar y luego manipular los indicadores de Expresión regular suministrados.
Sorprendentemente, no estoy autorizado a hacerlo ya que el bandera RegExp.prototype.global (más precisamente todos los indicadores) parecen ser de solo lectura. Desde allí la línea comentada 8.
Así que mi pregunta es: ¿Existe un agradable manera de cambiar las banderas de un objeto RegExp?
Realmente no quiero hacer cosas como esta:
if(!expression.global)
expression = eval(expression.toString() + "g");
Algunas implementaciones podrían no apoyar el evento RegExp.prototype.toString y simplemente heredan de la Object.prototype, o podría ser un formato diferente por completo. Y para empezar, parece una mala práctica de codificación.
veo. Bueno, edité la publicación, por lo que puedes eliminar la velocidad de descenso. :-) – Witiko
Hecho y hecho. ¡Lo siento por eso! – ridgerunner