Regexp поиск позиции в которой находится совпавшая группа
Подскажите с какой стороны подступиться, есть регулярное выражение с гуппами, например
var re = /^(\d+)(?: р. )?(\d+)?(?: м. )?(\d+)?(?: дн. )?$/ метод match возвращает все найденые группы в исходной строке. Вопрос, как в таком же массиве получить позиции в которых начинаются найденные группы? |
думаю, никак. А exec в цикле не устраивает?
|
exec выдает индекс вхождения всего выражения, а мне нужно получить индексы вхождения всех групп в выражении.
|
Могу я поинтересоваться, зачем?) Поиск позиции осуществляется с помощью опережающей негативной или положительной проверки.
|
На вскидку:
1. Сделать все скобки рабочими. 2. Для каждого последующего элемента массива вхождение будет суммой length предыдущих.) 3. ... 4. Profit! Но зачем?) |
пришла только такая мысль, сделать все скобки незапоминающими
/^(?:\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)); } |
Всем спасибо за подсказки, приблизительное решение нашел, исходное регулярное выражение трогать нельзя и в нем могут быть как рабочие, так и не рабочие группы, задача - найти координаты рабочих групп, попрбую на лету модифицировать исходное выражение в вариант предложенны Pavel M.,
Задача - плагин для хитровывернутого ввода по маске, где дефолтовое значение вычисляется из исходной маске. |
Часовой пояс GMT +3, время: 12:29. |