如何获取字符串中模式的所有索引?

时间:2012-03-31 16:52:26

标签: javascript

我想要这样的事情:

"abcdab".search(/a/g) //return [0,4]

有可能吗?

7 个答案:

答案 0 :(得分:7)

您多次can use RegExp#exec方法:

var regex = /a/g;
var str = "abcdab";

var result = [];
var match;
while (match = regex.exec(str))
   result.push(match.index);

alert(result);  // => [0, 4]

Helper function

function getMatchIndices(regex, str) {
   var result = [];
   var match;
   regex = new RegExp(regex);
   while (match = regex.exec(str))
      result.push(match.index);
   return result;
}

alert(getMatchIndices(/a/g, "abcdab"));

答案 1 :(得分:6)

您可以使用/滥用replace function

var result = [];
"abcdab".replace(/(a)/g, function (a, b, index) {
    result.push(index);
}); 
result; // [0, 4]

该函数的参数如下:

function replacer(match, p1, p2, p3, offset, string) {
  // p1 is nondigits, p2 digits, and p3 non-alphanumerics
  return [p1, p2, p3].join(' - ');
}
var newString = 'abc12345#$*%'.replace(/([^\d]*)(\d*)([^\w]*)/, replacer);
console.log(newString);  // abc - 12345 - #$*%

答案 2 :(得分:2)

如果您只想查找简单字符或字符序列,可以使用indexOf [MDN]

var haystack = "abcdab",
    needle = "a"
    index = -1,
    result = [];

while((index = haystack.indexOf(needle, index + 1)) > -1) {
    result.push(index);
}

答案 3 :(得分:1)

您可以获得所有匹配索引:

var str = "abcdab";
var re = /a/g;
var matches;
var indexes = [];
while (matches = re.exec(str)) {
    indexes.push(matches.index);
}
// indexes here contains all the matching index values

此处的演示演示:http://jsfiddle.net/jfriend00/r6JTJ/

答案 4 :(得分:1)

非正则表达式:

var str = "abcdabcdabcd",
    char = 'a',
    curr = 0,
    positions = [];

while (str.length > curr) {
    if (str[curr] == char) {
        positions.push(curr);
    }
    curr++;
}

console.log(positions);

http://jsfiddle.net/userdude/HUm8d/

答案 5 :(得分:1)

另一个非正则表达式解决方案:

function indexesOf(str, word) {
   const split = str.split(word)
   let pointer = 0
   let indexes = []

   for(let part of split) {
      pointer += part.length
      indexes.push(pointer)
      pointer += word.length
   }

   indexes.pop()

   return indexes
}

console.log(indexesOf('Testing JavaScript, JavaScript is the Best, JavaScript is Ultimate', 'JavaScript'))

答案 6 :(得分:0)

基于@jfriend00 回答但整理:

const getAllIndices = (str, strToFind) => {
  const regex = RegExp(strToFind, 'g')
  const indices = []
  let matches
  while (matches = regex.exec(str)) indices.push(matches.index)
  return indices
}

console.log(getAllIndices('hello there help me', 'hel'))
console.log(getAllIndices('hello there help me', 'help'))
console.log(getAllIndices('hello there help me', 'xxxx'))