2010-07-29 10 views
11

Hola Estoy usando el método indexOf para buscar si una cadena está presente dentro de otra cadena. Pero quiero obtener todas las ubicaciones de donde se encuentra la cadena? ¿Hay algún método para obtener todas las ubicaciones donde existe la cadena?Buscar todas las instancias de una cadena dentro de una cadena

<html> 
<head> 
    <script type="text/javascript"> 
     function clik() 
     { 
      var x='hit'; 
      //document.getElementById('hideme').value =''; 
      document.getElementById('hideme').value += x; 
      alert(document.getElementById('hideme').value); 
     } 

     function getIndex() 
     { 
      var z =document.getElementById('hideme').value; 
      alert(z.indexOf('hit')); 
     } 
    </script> 
</head> 
<body> 
    <input type='hidden' id='hideme' value=""/> 
    <input type='button' id='butt1' value="click click" onClick="clik()"/> 
    <input type='button' id='butt2' value="clck clck" onClick="getIndex()"/> 
</body> 
</html> 

¿Hay un método para obtener todas las posiciones?

Respuesta

31

Pruebe algo como:

var regexp = /abc/g; 
var foo = "abc1, abc2, abc3, zxy, abc4"; 
var match, matches = []; 

while ((match = regexp.exec(foo)) != null) { 
    matches.push(match.index); 
} 

console.log(matches); 
+0

¡Se me olvida tan fácilmente que el objeto coincidente tiene la propiedad "indexar"! – Pointy

+0

Muchas gracias, hombre! ¡Regex hizo el truco! – sai

1

No sé si hay una función incorporada para hacerlo. Usted podría hacerlo en un bucle sencillo, aunque:

function allIndexes(lookIn, lookFor) { 
    var indices = new Array(); 
    var index = 0; 
    var i = 0; 
    while(index = lookIn.indexOf(lookFor, index) > 0) { 
     indices[i] = index; 
     i++; 
    } 
    return indices; 
} 
+0

Tu código no funciona: - Tienes un bucle infinito si se encuentra un término (indexOf comienza en la posición encontrada) - Siempre ignorará la primera vez que lo pruebes si indexOf (...)> 0 en lugar de> = 0 – Congelli501

0

Puede usar indexOf ('searchstring',), utilizando el índice volvió 'última vez redonda' + 1 -1 hasta llegar de vuelta.

0

Aquí está una manera de expresiones regulares para hacerlo:

function positions(str, text) { 
    var pos = [], regex = new RegExp("(.*?)" + str, "g"), prev = 0; 
    text.replace(regex, function(_, s) { 
    var p = s.length + prev; 
    pos.push(p); 
    prev = p + str.length; 
    }); 
    return pos; 
} 
12

Aquí es una función de trabajo:

function allIndexOf(str, toSearch) { 
    var indices = []; 
    for(var pos = str.indexOf(toSearch); pos !== -1; pos = str.indexOf(toSearch, pos + 1)) { 
     indices.push(pos); 
    } 
    return indices; 
} 

Uso ejemplo:

> allIndexOf('dsf dsf kfvkjvcxk dsf', 'dsf'); 
[0, 4, 18] 
Cuestiones relacionadas