Javascript Regex: Как найти индекс каждого подвыражения?

Предположим, у меня есть строка: BLAH BLAH BLAH copy 2, Я хочу найти указатель двух частей: слово "копия" и число, которое может следовать за словом "копия".

У меня есть регулярное выражение: /(copy)\s+([0-9]+)$/i который успешно совпадает с копией и 2 из приведенной выше строки. Как я могу найти индекс числа 2? Я знаю, что могу использовать.index, чтобы найти позицию совпавшего теста "копия 2", но я хотел бы получить позицию "2", чтобы я мог увеличивать ее.

4 ответа

Решение

Если вам нужно заменить номер копии на увеличенный номер, используйте replace плюс функция заменителя:

'BLAH BLAH BLAH copy 2'.replace(/(copy )(\d+)/, function (s, s1, s2) {
    return s1 + (Number(s2) + 1);
});

Если вы немного измените регулярное выражение, индекс числа может быть вычислен:

var matches = "BLAH BLAH BLAH copy 2".match(/(copy)(\s+)([0-9]+)$/i);
var numberIndex = matches.index + matches[1].length + matches[2].length;

Но вам действительно не нужно это для увеличения числа:

var matches = "BLAH BLAH BLAH copy 2".match(/(copy)\s+([0-9]+)$/i);
var incremented = (+matches[2]) + 1;

Вы должны пойти с регулярным выражением /^(.*?copy\s+)(\d+)$/i и тогда длина $1 - это позиция $2 (номер копии).

Изменить: Ваш тестовый код ( скрипка):

var str = "BLAH BLAH BLAH copy 2";
var m = str.match(/^(.*?copy\s+)(\d+)$/i);
alert("Found '" + m[2] + "' at position " + m[1].length);

Изменить регулярное выражение /(copy)\s+([0-9]+)$/i в /^((.*)(copy)\s+)([0-9]+)$/i

Тогда положение copy длина $2 и положение чисел длина $1, Номер будет в $4

Другие вопросы по тегам