如何在RegExp中为每个匹配获取startIndex

时间:2015-11-10 01:32:04

标签: javascript regex

我在RegExp结果上苦苦挣扎。基本上我想要的是startIndex,它给出了与源字符串相关的每个匹配的确切位置。所以不是带字符串的数组

var regex = /(?:\w*) from "(\w*)"/g
var result = regex.exec('import foo from "foo"');
console.log(result.slice(1)) // => ["foo"]

我想要一个像这样的对象:

[{
  value: 'foo',
  startIndex: 17
}]

如果不使用特殊的库,我认为这是不可能的,所以我的问题是:

您是否知道任何库可以返回更精确的匹配信息或任何其他解决方案如何解决?

请注意,这只是一个RegExp示例。在实际应用程序中,我将有超过10个完全不同的RegExp。因此,首选动态方法。

加成

我需要这个用于GitHub Linker的下一个主要版本。目前,链接替换是使用jquery选择器完成的,这不是那么灵活,有时是错误的。 RegExp有望减少开销,因此其他开发人员可以使用Ruby,Python等其他语言轻松扩展GitHub Linker ....目前只支持JavaScript。

这就是为什么我在寻找一个可靠而灵活的解决方案的原因。

- 谢谢

1 个答案:

答案 0 :(得分:-1)

接受的答案here似乎很接近。我已经在下面对它进行了调整,它似乎接近了所需要的。

var str = 'import foo from "foo" import bar from "bar"'
var regex = /(?:\w*) from "(\w*)"/g;
var output = [];
while ((result = regex.exec(str))) {
  var  offset = result[0].lastIndexOf(result[1]);
  output.push('Value: ' + result[1] + ', startIndex: ' + (result.index+offset));
}

document.getElementById('results').innerHTML = output;
<div id="results"></div>