如何获得JavaScript regexp子匹配的位置?

时间:2014-11-24 17:12:12

标签: javascript regex

以下是我的RegEx的简化版本:

re = /a(.*)b(.*)c(.*)d/;
match = re.exec("axbxcxd");

正如所料,这导致match[1]match[2]match[3]"x",但我需要获得中间匹配编号2的位置。在Python中,我可以使用match.position(2)。在JavaScript中有没有相同的方法来获得子匹配的位置?我不能只搜索匹配的字符串,因为其他一些子匹配可能是相同的。

2 个答案:

答案 0 :(得分:1)

JavaScript还没有集成的API(还)来返回子匹配的位置。

有一些discussion on the ECMAScript mailing list关于添加这样的API,但到目前为止没有结果。

已经有一些工具,如regexplainedHiFi Regex Tester。虽然在/aa(a)/匹配字符串"aaa"的情况下,他们无法确定子匹配的位置。

这些工具的作用是使用regexp.exec()搜索string.indexOf()返回的主匹配中的子匹配。这是一些示例代码:

var string = "xxxabcxxx";
var regexp = /a(b(c))/g;

var matches = regexp.exec(string);
if (matches) {
  matches[0] = {
    text: matches[0],
    pos: regexp.lastIndex - matches[0].length
  };

  for(var i = 1; i < matches.length; i++) {
    matches[i] = {
      text: matches[i],
      pos: string.indexOf(matches[i], matches[0].pos)
    };
  }
}

console.log(matches);

这将输出包含子匹配位置的匹配对象数组:

  [
    {
      text: "abc",
      pos: 3
    },
    {
      text: "bc",
      pos: 3
    },
    {
      text: "c",
      pos: 5
    }
  ]

虽然再次注意上述代码,如上述工具,并不适用于所有情况。

答案 1 :(得分:-2)

match对象有一个名为index的东西,我认为这就是你要找的东西:

["axbxcxd", "x", "x", "x", index: 0, input: "axbxcxd"]


修改

确定。我想我第一次没有得到正确的问题。这是更新的答案:

re = /a(.*)b(.*)c(.*)d/;
str = "axbxcxd";
match = re.exec(str);
searchStr = match[1]; //can be either match[2],match[3]
searchStrLen = match[1].length; //can be either match[2],match[3]
var index, indices = []
var startIndex = 0;
while ((index = str.indexOf(searchStr, startIndex)) > -1) {
        indices.push(index);
        startIndex = index + searchStrLen;
}
console.log(indices[1]); // index of match[2]
console.log(indices[0]); // index of match[1]
console.log(indices[2]); // index of match[3] .. and so on, because some people don't get it with a single example

这可能是一个黑客,但应该工作。 一个工作小提琴:http://jsfiddle.net/8dkLq8m0/