LINUX.ORG.RU

regexp ловушка

 


0

1

Всем доброго времени суток. Подскажите как правильно собрать регулярку, чтобы достать «308014». Я не понимаю почему положительный lookahead срабатывает только на вторые скобки «]}{[», есть идеи почему так? Сразу оговорюсь, что само значение нужно искать с помощью .* потому, что эта регулярка будет юзаться в разных кейсах. И вообще значения могут быть любые, поэтому я отталкиваюсь от скобок

Вот регулярка: (?<={\[version\]}{\[).*(?=\]}{\[)

Вот строка: {[device_model]}{[iPhone XS]}{[version]}{[308014]}{[device_model]}{[iPhone XS]}

Вот ответ: 308014]}{[device_model

Ответ на: комментарий от olelookoe

эх, если бы) доставать нужно разные значения по разным ключам. Я должен иметь возможность поменять «version» на любую другую строку и достать по ней значение, поэтому .* увы

alexsandr753
() автор топика

Если это пары ключ-значение, заключённые в {[]}, и тебе нужно то, что напротив version, то ты не городи огорода с одной царь-регуляркой, а разбери в последовательность маленькой регулярочкой, сгруппируй, перегони в ключ-значение, и только тогда правь и клей обратно. Чай не эмбедщик.

t184256 ★★★★★
()
Ответ на: комментарий от alexsandr753

ну смари, у меня перед глазами ровно одна исходная строка
она нормально бьется на группы
({[([\w\d_ ]+)]})+
в группу 1 попадут {[device_model]}, {[iPhone XS]}, {[version]},{[308014]}, {[device_model]}, {[iPhone XS]}
в группу 2 попадут device_model, iPhone XS, version, 308014, device_model, iPhone XS
из чего матч каунтером извлекается твое 308014

например

olelookoe ★★★
()
Ответ на: комментарий от alexsandr753

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

$ cat /tmp/testfile                                                                                                                       
{[device_model]}{[iPhone XS]}{[version]}{[cорок ТыСяч ОБеЗьян В ЖоПуСунулиБананъ!!!111]}{[device_model]}{[iPhone XS]}
{[device_model]}{[Random Phone]}{[version]}{[308014]}{[device_model]}{[Dumb Phone 9000]}
{[device_model]}{[яФон]}{[version]}{[666]}{[device_model]}{[яФон 777 РОСА Эдиш0нъ]}

$ sed -E 's/.*version\]\}\{\[([^]]+)\].*/\1/' /tmp/testfile 
cорок ТыСяч ОБеЗьян В ЖоПуСунулиБананъ!!!111
308014
666
CrX ★★★★★
()

Я не понимаю почему положительный lookahead срабатывает только на вторые скобки «]}{[»

потому что * - «жадный» (greedy) паттерн

.* матчит сразу всю строку до конца и потом уже начинает обратное движение, пока не сматчится оставшаяся часть регулярки. Т.е. lookahead находит не следующее, а самое последнее вхождение ]}{[

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

(?<={\[version\]}{\[).*?(?=\]}{\[) - так сработает

но группы тут явно более правильное решение

CaHbl4
()