Как найти индексы групп в соответствии регулярных выражений JavaScript?

Когда я пишу регулярное выражение как:

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' вместо того найденным в группе.

Там какой-либо путь состоит в том, чтобы получить смещение подобранной группы?

17
задан Sebastian Zartner 28 October 2016 в 09:09
поделиться

1 ответ

Ты не можешь напрямую получить индекс группы сравнения. Что вам нужно сделать, так это сначала поместить каждый символ в группу сравнения, даже те, которые вас не волнуют:

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
16
ответ дан 30 November 2019 в 12:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: