Регулярное выражение для совпадения числа в середине

124
10

Следующая строка представляет свойство viewmodel и в этом случае имеет 3 разных индекса:

PROGRAMA_FASES [ 1 ].PROGRAMA_FASE_REPLICAS [ 0 ].PROGRAMA_FASES.PROGRAMA_PREGUNTAS [ 2 ].Value

Я использую эти функции для увеличения первого индекса или последнего.

function increment_last(v) {
return v.replace(/[0-9]+(?!.*[0-9])/, function (match) {
return parseInt(match, 10) + 1;
});
}

function increment_first(v) {
return v.replace(/(\d+)/, function (match) {
return parseInt(match, 10) + 1;
});
}

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

Можете ли вы помочь мне с регулярным выражением, которое соответствует только индексу посередине? В этом случае это будет "0".

большое спасибо

спросил(а) 2021-01-25T15:19:06+03:00 4 месяца, 3 недели назад
1
Решение
77

Если шаблон согласован (TEXT[NUMBER].TEXT[NUMBER].TEXT[NUMBER]), вы можете сопоставить все вхождения и затем выбрать второе совпадение. Простой пример (при условии, что вышеуказанный ТЕКСТ всегда является строковым символом и никогда не содержит чисел):

var number = "PATTERN[0].TO[1].MATCH[2]".match(/\d/g)[1];

Если вы ожидаете, что числа будут смешаны и хотите совместить только цифры в ваших скобках, вы можете обновить регулярное выражение, например /\[\d\]/g, а затем выбрать число из согласованных скобок.

ответил(а) 2021-01-25T15:19:06+03:00 4 месяца, 3 недели назад
77

Следующее регулярное выражение будет отображать все три значения.

.*\[(\d*)*\].*\[(\d*)*\].*\[(\d*)*\].*

Вы можете получить к ним доступ в следующем примере

var myString = "PROGRAMA_FASES[1].PROGRAMA_FASE_REPLICAS[0].PROGRAMA_FASES.PROGRAMA_PREGUNTAS[2].Value";
var myRegexp = /.*\[(\d*)*\].*\[(\d*)*\].*\[(\d*)*\].*/g;
var match = myRegexp.exec(myString);
console.log(match[1]); // Will output 1

ответил(а) 2021-01-25T15:19:06+03:00 4 месяца, 3 недели назад
45

Спасибо вам за ваши ответы, которые дали мне лучший подход и еще один способ мышления решения.

Наконец, я нашел этот ответ qaru.site/questions/203648/... который дает отличное решение для этого и может использоваться для многих других целей.

В моем случае я могу просто увеличить желаемую позицию индекса, вызвав функцию следующим образом:

function increment_index(v, i) {
return replaceNthMatch(v, /(\d+)/, i, function (val) {
return parseInt(val, 10) + 1;
});
}

ответил(а) 2021-01-25T15:19:06+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема