Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Regexp поиск позиции в которой находится совпавшая группа (https://javascript.ru/forum/misc/25782-regexp-poisk-pozicii-v-kotorojj-nakhoditsya-sovpavshaya-gruppa.html)

Casufi 15.02.2012 12:48

Regexp поиск позиции в которой находится совпавшая группа
 
Подскажите с какой стороны подступиться, есть регулярное выражение с гуппами, например
var re = /^(\d+)(?: р. )?(\d+)?(?: м. )?(\d+)?(?: дн. )?$/

метод match возвращает все найденые группы в исходной строке.
Вопрос, как в таком же массиве получить позиции в которых начинаются найденные группы?

nerv_ 15.02.2012 13:15

думаю, никак. А exec в цикле не устраивает?

Casufi 15.02.2012 13:32

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

nerv_ 15.02.2012 14:55

Могу я поинтересоваться, зачем?) Поиск позиции осуществляется с помощью опережающей негативной или положительной проверки.

Aetae 15.02.2012 15:02

На вскидку:
1. Сделать все скобки рабочими.
2. Для каждого последующего элемента массива вхождение будет суммой length предыдущих.)
3. ...
4. Profit!

Но зачем?)

Pavel M. 15.02.2012 15:12

пришла только такая мысль, сделать все скобки незапоминающими
/^(?:\d+)(?: р. )?(?:\d+)?(?: м. )?(?:\d+)?(?: дн. )?$/
а 3 группы заключить в запоминающие скобки
var re = /^((?:\d+)(?: р. )?)((?:\d+)?(?: м. )?)((?:\d+)?(?: дн. )?)$/,
	m = '33 р. 444444 м. 555 дн. '.match(re);

if (m) {
  alert('Первый индекс: ' + m['index']);
  if (m[2]) alert('Второй индекс: ' + (m['index'] + m[1].length));
  if (m[3]) alert('Третий индекс: ' + (m['index'] + m[1].length + m[2].length));
}

Casufi 15.02.2012 17:09

Всем спасибо за подсказки, приблизительное решение нашел, исходное регулярное выражение трогать нельзя и в нем могут быть как рабочие, так и не рабочие группы, задача - найти координаты рабочих групп, попрбую на лету модифицировать исходное выражение в вариант предложенны Pavel M.,

Задача - плагин для хитровывернутого ввода по маске, где дефолтовое значение вычисляется из исходной маске.


Часовой пояс GMT +3, время: 12:29.