El tutorial o código que encontrarás en este post es la resolución más eficiente y efectiva que encontramos a esta duda o problema.
Solución:
Instancias de la String
constructor tiene un .search()
método que acepta un RegExp y devuelve el índice de la primera coincidencia.
Para iniciar la búsqueda desde una posición en particular (simulando el segundo parámetro de .indexOf()
) puedes slice
de la primera i
caracteres:
str.slice(i).search(/re/)
Pero esto obtendrá el índice en el más corto string (después de que se cortó la primera parte), entonces querrá agregar la longitud de la parte cortada (i
) al índice devuelto si no fuera -1
. Esto le dará el índice en el original string:
function regexIndexOf(text, re, i)
var indexInSuffix = text.slice(i).search(re);
return indexInSuffix < 0 ? indexInSuffix : indexInSuffix + i;
Combinando algunos de los enfoques ya mencionados (el indexOf es obviamente bastante simple), creo que estas son las funciones que harán el truco:
function regexIndexOf(string, regex, startpos) 0)) : indexOf;
function regexLastIndexOf(string, regex, startpos)
regex = (regex.global) ? regex : new RegExp(regex.source, "g" + (regex.ignoreCase ? "i" : "") + (regex.multiLine ? "m" : ""));
if(typeof (startpos) == "undefined")
startpos = string.length;
else if(startpos < 0)
startpos = 0;
var stringToWorkWith = string.substring(0, startpos + 1);
var lastIndexOf = -1;
var nextStop = 0;
while((result = regex.exec(stringToWorkWith)) != null)
lastIndexOf = result.index;
regex.lastIndex = ++nextStop;
return lastIndexOf;
ACTUALIZACIÓN: Editado regexLastIndexOf()
por lo que parece imitar lastIndexOf()
ahora. Por favor, hágame saber si todavía falla y en qué circunstancias.
ACTUALIZACIÓN: pasa todas las pruebas que se encuentran en los comentarios de esta página y las mías. Por supuesto, eso no significa que sea a prueba de balas. Cualquier comentario apreciado.
Tengo una versión corta para ti. ¡Funciona bien para mí!
var match = str.match(/[abc]/gi);
var firstIndex = str.indexOf(match[0]);
var lastIndex = str.lastIndexOf(match[match.length-1]);
Y si quieres una versión prototipo:
String.prototype.indexOfRegex = function(regex)
var match = this.match(regex);
return match ? this.indexOf(match[0]) : -1;
String.prototype.lastIndexOfRegex = function(regex)
var match = this.match(regex);
return match ? this.lastIndexOf(match[match.length-1]) : -1;
EDITAR : si desea agregar soporte para fromIndex
String.prototype.indexOfRegex = function(regex, fromIndex)
var str = fromIndex ? this.substring(fromIndex) : this;
var match = str.match(regex);
return match ? str.indexOf(match[0]) + fromIndex : -1;
String.prototype.lastIndexOfRegex = function(regex, fromIndex)
var str = fromIndex ? this.substring(0, fromIndex) : this;
var match = str.match(regex);
return match ? str.lastIndexOf(match[match.length-1]) : -1;
Para usarlo, tan simple como esto:
var firstIndex = str.indexOfRegex(/[abc]/gi);
var lastIndex = str.lastIndexOfRegex(/[abc]/gi);