Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   позиция подмасок в в регулярном выражении (https://javascript.ru/forum/misc/36924-poziciya-podmasok-v-v-regulyarnom-vyrazhenii.html)

rgl 05.04.2013 12:11

nerv_,
А где тут позиции?
(т.е. где число?)

nerv_ 05.04.2013 12:43

Цитата:

Сообщение от rgl
А где тут позиции?

во-первых, нафига они нужны, если требуется
Цитата:

Сообщение от edison
сделать подсветку найденных групп

во-вторых
function( a, b, c ) { // с - позиция a

rgl 05.04.2013 13:33

Цитата:

Сообщение от nerv_ (Сообщение 244379)
во-первых, нафига они нужны,

во-вторых
function( a, b, c ) { // с - позиция a

Во-первых, как подсветить, не зная что нужно подсвечивать?
во-вторых, c - позиция всего выражения, а не группы.

nerv_ 05.04.2013 16:26

Цитата:

Сообщение от rgl
как подсветить, не зная что нужно подсвечивать

первый пост почитай
Цитата:

Сообщение от edison
сделать подсветку найденных групп в исходном тексте


Цитата:

Сообщение от rgl
c - позиция всего выражения, а не группы

о чем я написал постом выше

rgl 05.04.2013 17:30

Цитата:

Сообщение от nerv_ (Сообщение 244425)
первый пост почитай

Читаю:
Цитата:

Сообщение от nerv_ (Сообщение 244359)
alert( 'some text bla bla bla text la la la'.replace( /t(ext)/g, function( a, b ) { return '#' + b + '#';}) );

и вижу, что получается не то. Ну, напр. сделаем так:

alert( 'CLEAR="left" causes the next text line to start down as soon as the left margin is clear'.replace( /next t(ext)/g, function( a, b ) { return '#' + b + '#';}) );


Получается не
CLEAR="left" causes the next t#ext# line to start down as soon as the left margin is clear
а
CLEAR="left" causes the #ext# line to start down as soon as the left margin is clear

Aetae 05.04.2013 23:11

Тут это сделано, код не обсфуцирован - бери да пользуйся.

edison 07.04.2013 02:16

Цитата:

Сообщение от Aetae (Сообщение 244474)
бери да пользуйся.

Спасибо, но там выделяет не именно те матчи которые совпали, а идет реплейс
^(.*?)match1(.*?)match2(.*?)match3(.*?)$
на
$1<span class="group-1">match1</span>$2<span class="group-2">match2</span>$3<span class="group-3">match3</span>$4

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

Если ввести там регексп из моего первого сообщения то на выходе будет
xxab
aaaa
aaaa
bbbb
baxt

ну и группа в группе тоже сдвинет весь результат
(aaa(a))\na(a)aa\nbb(b)

xxab
aaaa
aaaa
bbbb
baxt

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

мысль только распарсить регулярку поочередно закрывая все группы (?:) кроме одной и по бокам этой группы заключать в скобки части регулярки.


допустим имеем
(aaa(a))\na(a)*aa\nbb(b)
преобразуем
(aaa(?:a))(\na(?:a)*aa\nbb(?:b)) т.к. первая группа начинается с самого вхождения, то выйдет всего 2 группы, тоже самое если мы работаем с последней группой и регексп заканчивается ей

получаем

aaaa

и

aaaa
bbbb

получаем начальную позицию длина pos=матч1+index
высчитываем позицию окончания
poslast=матч0-(матч1+матч3), тем самым мы высчитаем длину матча (a)* - когда группа повторяется или poslast=длинна совпадения+матч0-(матч1+матч2+матч3) в зависимости от того будем мы захватывать *?+ и т.д. после группы те. будет у нас так (a)* или мы преобразуем группу в ((?:a)*)

итого на выходе мы будем иметь позицию и длину вхождения

второе преобразование соответственно такое

(?:(aaa)(a))(\na(?:a)*aa\nbb(?:b))

((?:aaa(?:a))\na)(a)*(aa\nbb(?:b))

и т.д.

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

поправлюсь, количество новых групп не будет ограничено от 2 до 3, а будет расширятся если у нас подгруппа для которой мы находим позицию находится в другой подгруппе (-ах) т.е s(aaa(a)s)x - получится нужно проставить еще 4 подгруппы (s)(?:(aaa)(a)(s))(x) и чем больше вложений тем больше подгрупп будет

В общем изврат)) Возможно кому-то пригодится для дальнейших раздумий, но писать такой велосипед...

nerv_ 09.04.2013 01:03

Цитата:

Сообщение от edison
nerv_ заменяется ведь все вхождение регексп, вот если бы только подгруппы можно было заменить

alert( 'some text bla bla bla text la la la'.replace( /(t)(ext)/g, function( a, b, c ) { return b+ '#' + c + '#';}) );

или переписывать регу

Цитата:

Сообщение от rgl
и вижу, что получается не то

ну а додумать?) не? :)

Aetae 09.04.2013 01:07

Цитата:

Сообщение от nerv_ (Сообщение 244935)
ну а додумать?) не? :)

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

nerv_ 09.04.2013 01:15

Цитата:

Сообщение от Aetae
функция должна работать с произвольной.

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

Я ток седня закончил составлять регулярку в многобукв. Вытаскивает из текста числа прописью и переводит их в числа: одиннадцать целых две сотых -> 11.02


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