Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Perl: Общие вопросы > Замена символов между тэгами |
Автор: amg 12.7.2007, 13:02 | ||
С виду простая задачка: есть строка $_ = 'aXbX<a>cXbX</a>eXgXaXbX<a>cXbX</a>eXgX'; нужно заменить X на У, но не везде, а только внутри тэгов. Т.е. должно получиться aXbX<a>cYbY</a>eXgXaXbX<a>cYbY</a>eXgX Понятно, что можно выкусить нужные подстроки, сделать в них замены и вставить обратно, либо как-то так:
Но верится, что что так просто формулируемая задачка не решается обыкновенным регулярным выраженим, без выполнения дополнительного кода: что-то подобное уже http://forum.vingrad.ru/topic-148509.html, и тогда нашлось потрясающе элегантное http://forum.vingrad.ru/index.php?showtopic=148509&view=findpost&p=1115071. |
Автор: Nab 12.7.2007, 14:43 | ||
У меня пока получилось вот такое
Но учитывая что \G без предыдущего совпадения соответствует ^, то в подстроке желательно убрать лидирующий текст до первого тега... Буду думать еще, может и нарисуюю работающий вариант... |
Автор: Nab 12.7.2007, 15:13 | ||
Сейчас есть решение, не в одну регулярку а в две ![]() первой просто позиционирую первую pos для \G:
|
Автор: JAPH 12.7.2007, 15:42 | ||
У меня такое, которому далеко до совершенства:
|
Автор: JAPH 12.7.2007, 16:20 | ||
Уложился в одну регулярку. Насколько элегантно - не знаю.. ![]()
Добавлено @ 16:25 Преимущества - применима к замене не только одного символа. Недостатки - длинная ![]() |
Автор: amg 13.7.2007, 10:09 |
Nab, JAPH, как всегда, на высоте! Спасибо большое. Может настанут, наконец, те светлые времена, когда и я буду понимать, как работает \G Но я, как всегда, перемудрил с вопросом. Засада в том, что в на самом деле мне нужно заменять не X на Y, а < и > на < и > соответственно. |
Автор: JAPH 13.7.2007, 13:42 | ||||
Так с этого и надо было начинать! (: Ну, скорее, недомудрили ![]() Одной регуляркой без 'e' уже не обойтись, так как возможностей замены две.
Немного подумав Хотя.. ![]()
|
Автор: amg 13.7.2007, 15:06 | ||
JAPH, гениально! Твое решение даже легко вполне универсальным сделать.
|