Когда я пишу регулярное выражение как:
var m = /(s+).*?(l)[^l]*?(o+)/.exec("this is hello to you");
console.log(m);
Я получаю объект соответствия, содержащий следующее:
{
0: "s is hello",
1: "s",
2: "l",
3: "o",
index: 3,
input: "this is hello to you"
}
Я знаю индекс всего соответствия от index
свойство, но я также должен знать запуск и конец подобранных групп. Используя простой поиск не будет работать. В этом примере это найдет первый 'l' вместо того найденным в группе.
Там какой-либо путь состоит в том, чтобы получить смещение подобранной группы?
Ты не можешь напрямую получить индекс группы сравнения. Что вам нужно сделать, так это сначала поместить каждый символ в группу сравнения, даже те, которые вас не волнуют:
var m= /(s+)(.*?)(l)([^l]*?)(o+)/.exec('this is hello to you');
Теперь вы получили полное совпадение по частям:
['s is hello', 's', ' is hel', 'l', '', 'o']
Так что вы можете сложить длины строк до вашей группы, чтобы получить смещение от индекса сравнения к индексу группы:
function indexOfGroup(match, n) {
var ix= match.index;
for (var i= 1; i<n; i++)
ix+= match[i].length;
return ix;
}
console.log(indexOfGroup(m, 3)); // 11