如何获取 JavaScript 正则表达式子匹配的位置
How to get the position of a JavaScript regexp sub-match?
这是我的正则表达式的简化版本:
re = /a(.*)b(.*)c(.*)d/;
match = re.exec("axbxcxd");
正如预期的那样,这导致match[1]
、match[2]
和match[3]
被"x"
,但我需要得到中间匹配 2 的位置。在 Python 中,我可以使用 match.position(2)
。JavaScript 中是否有任何等效的方法来获取子匹配的位置? 我不能只搜索匹配的字符串,因为其他一些子匹配项可能是相同的。
JavaScript 还没有
一个集成的 API 来返回子匹配项的位置。
在ECMAScript 邮件列表中有一些关于添加这样一个 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
}
]
但再次注意,上面的代码与上述工具一样,并非适用于所有情况。
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/
相关文章:
- java.net和javascript之间正则表达式的差异
- Grunt匹配正则表达式
- 不同浏览器中的空白字符正则表达式行为
- 正则表达式在字符串中找到base64
- 子字符串/正则表达式以获取字符串中保存的 SRC 值
- 调用正则表达式匹配的函数
- Javascript中的正则表达式,用于只有数字的字符串,并且不应在除数字以外的任何位置包含任何字符
- 匹配字符串中任意位置的 3 个字符的正则表达式
- 使用正则表达式修改标签位置
- 使用 javascript 查找文本中 HTML 标签的位置,最好不使用正则表达式
- Javascript中的正则表达式:位置表而不是出现表
- 如何编写正则表达式来验证特殊位置的字符
- 将输入光标设置为javascript正则表达式之后的正确位置
- 在等式中适当位置插入*的正则表达式
- 卡号正则表达式和插入符号/光标位置(javascript)
- 使用正则表达式在第x个位置间隔替换字符串(javascript)
- 仅在特定位置删除方括号的正则表达式
- 如何在JavaScript中获得正则表达式匹配的开始和结束位置
- 难以找到插入“排除词”的位置;在正则表达式中
- 如何使用 JavaScript 正则表达式提取此字符串中的位置