15

Hello I am using indexOf method to search if a string is present inside another string. But I want to get all the locations of where string is? Is there any method to get all the locations where the string exists?

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

Is there a method to get all positions?

Blundering Philosopher
  • 6,245
  • 2
  • 43
  • 59
sai
  • 4,907
  • 4
  • 24
  • 18

5 Answers5

36

Try something like:

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);
cic
  • 7,310
  • 3
  • 23
  • 35
15

Here is a working function:

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

Use example:

> allIndexOf('dsf dsf kfvkjvcxk dsf', 'dsf');
[0, 4, 18]
Congelli501
  • 2,403
  • 2
  • 27
  • 28
1

I don't know if there's a built in function to do it. You could do it in a simple loop though:

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;
}
Kiersten Arnold
  • 1,840
  • 1
  • 13
  • 17
  • Your code doesn't work : - You have an infinite loop if a term is found (indexOf begin at the found pos) - It will always ignore the first occurrence as you test if indexOf(...) > 0 instead of >= 0 – Congelli501 Jan 07 '14 at 09:50
0

You can use indexOf('searchstring', ), using the index returned 'last time round' + 1 until you get -1 back.

Will A
  • 24,780
  • 5
  • 50
  • 61
0

Here's a regex way to do it:

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;
}
Pointy
  • 405,095
  • 59
  • 585
  • 614