Saltar al contenido

¿Existe una versión de String.indexOf() de JavaScript que permita expresiones regulares?

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);

Comentarios y calificaciones

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *