2010-07-29 154 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]