2010-07-29 161 views
11

你好我正在使用indexOf方法来搜索一个字符串是否存在于另一个字符串中。但我想要获取字符串的所有位置?有没有任何方法来获取字符串存在的所有位置?在字符串中搜索字符串的所有实例

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

有没有一种方法来获得所有职位?

回答

31

试着这么做:

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

我很容易忘记匹配对象具有“索引”属性! – Pointy 2010-07-29 19:03:41

+0

非常感谢!正则表达式做了诡计! – sai 2010-07-29 19:04:04

1

我不知道是否有内置的函数来做到这一点。你可以做一个简单的循环,但:

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

您的代码无效: - 如果找到一个术语(indexOf从找到的pos开始),则会出现无限循环 - 如果indexOf(...)> 0,则它会始终忽略第一次出现的位置而不是> = 0 – Congelli501 2014-01-07 09:50:38

0

可以使用的indexOf(“搜索字符串”),使用索引返回“上一轮” + 1,直到你得到-1回来。

0

这里有一个正则表达式的方式来做到这一点:

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

这里是一个工作的功能:

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

使用例如:

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