2010-07-29 7 views
11

Hallo Ich benutze die Methode indexOf, um zu suchen, ob eine Zeichenfolge in einer anderen Zeichenfolge vorhanden ist. Aber ich möchte alle Orte wo String ist? Gibt es eine Methode, um alle Orte zu erhalten, wo die Zeichenfolge existiert?Suche nach allen Instanzen einer Zeichenfolge in einer Zeichenfolge

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

Gibt es eine Methode, um alle Positionen zu bekommen?

Antwort

31

Versuchen Sie so etwas wie:

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

vergesse ich so leicht, dass das Match-Objekt die Eigenschaft "index" hat! – Pointy

+0

Vielen Dank Mann! Regex hat es geschafft !! – sai

1

Ich weiß nicht, ob es eine eingebaute Funktion gibt, um es zu tun. Sie tun könnte es in einer einfachen Schleife aber:

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

Ihr Code funktioniert nicht: - Sie haben eine Endlosschleife, wenn ein Begriff gefunden wird (indexOf beginnt an der gefundenen Position) - Er ignoriert immer das erste Vorkommen, wenn Sie if indexOf (...)> 0 testen anstelle von> = 0 – Congelli501

0

Sie können indexOf verwenden (‚search‘) kehrte den Index ‚letztes Mal um‘ + 1, bis Sie erhalten -1 zurück.

0

Hier ist ein regex Weg, es zu tun:

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

Hier ist eine Arbeitsfunktion:

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

Anwendungsbeispiel:

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