以下是我的RegEx的简化版本:
re = /a(.*)b(.*)c(.*)d/;
match = re.exec("axbxcxd");
正如所料,这导致match[1]
,match[2]
和match[3]
为"x"
,但我需要获得中间匹配编号2的位置。在Python中,我可以使用match.position(2)
。在JavaScript中有没有相同的方法来获得子匹配的位置?我不能只搜索匹配的字符串,因为其他一些子匹配可能是相同的。
答案 0 :(得分:1)
JavaScript还没有集成的API(还)来返回子匹配的位置。
有一些discussion on the ECMAScript mailing list关于添加这样的API,但到目前为止没有结果。
已经有一些工具,如regexplained和HiFi 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/