|
Модераторы: ginnie |
|
Сisa |
|
||||
Бывалый Профиль Группа: Участник Сообщений: 179 Регистрация: 18.1.2013 Репутация: нет Всего: нет |
Для любого парного тега хтмл
и т.п. с произвольным содержимым внутри тега нужно вставить пропущенную скобку < с помощью регулярного выражения perl :
и не получается :( Поможете? Это сообщение отредактировал(а) Сisa - 16.12.2014, 22:40 |
||||
|
|||||
tzirechnoy |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: нет Всего: 16 |
Этому регекспу для соответствия надо два знака меньшэ -- тот, что первым символом в первом подвыражэнии, и тот, что единственным символом во втором.
А в строке знак меньшэ -- один. Так что он и не получается. |
|||
|
||||
Сisa |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 179 Регистрация: 18.1.2013 Репутация: нет Всего: нет |
Прошу прощения, что получилось так, что я отредактировал свое сообщение после Вашего ответа.
Добавлено @ 22:52
Если бы такое получилось т.е. так же нельзя в левой части употреблять $1 а то бы наверно заработало ? Это сообщение отредактировал(а) Сisa - 16.12.2014, 22:55 |
|||
|
||||
Сisa |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 179 Регистрация: 18.1.2013 Репутация: нет Всего: нет |
Как то все не так. Для простых строк работает (первых двух), а чуть сложнее уже ошибки. Это не регулярное выражение в одну строку. А если уже функция, и вовсе без регулярных наверно можно через сплит-джоин. А нужно то ведь для много строчного аргумента, где начало тега в одной строке, а парный тег в другой может быть, тем более тег с пропущенным символом < может содержать другие теги. |
|||
|
||||
ginnie |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 1 Всего: 49 |
Сisa, если я правильно понял задание, вот мой вариант
Это сообщение отредактировал(а) ginnie - 17.12.2014, 19:04 -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
Сisa |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 179 Регистрация: 18.1.2013 Репутация: нет Всего: нет |
ginnie, ведь не работает?
say @strings; print @strings; |
|||
|
||||
ginnie |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 1 Всего: 49 |
Сisa, можно поконкретнее написать, что не работает?
Я сейчас новые для себя конструкции в Perl осваиваю, поэтому код получился довольно нетрадиционный. Это сообщение отредактировал(а) ginnie - 17.12.2014, 23:23 -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
Сisa |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 179 Регистрация: 18.1.2013 Репутация: нет Всего: нет |
Символ < не восстанавливается? Цель его восстановить, потому что он пропущен в разных тегах длинного хтмл. |
|||
|
||||
ginnie |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 1 Всего: 49 |
Сisa, я делал по условию, что восстанавливаться треугольная скобка должна в парных тегах, где только её нет (а слеш есть), т.е. в примере в двух последних строках.
Я во всех вариантах не проверял, просто подкинул Вам идею и реализацию. Это сообщение отредактировал(а) ginnie - 17.12.2014, 23:56 -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
Сisa |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 179 Регистрация: 18.1.2013 Репутация: нет Всего: нет |
ginnie спасибо! все работает! и с разными тегами одновременно!
Правда непонятно как все устроено, но ведь работает! Надо будет разобрать по буквам |
|||
|
||||
ginnie |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 1 Всего: 49 |
Сisa, сегодня уже поздно, я завтра все подробно опишу.
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
Сisa |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 179 Регистрация: 18.1.2013 Репутация: нет Всего: нет |
Центр внимания (и наверно не только моего) переместился с моего вопроса на Ваш подход в работающем решении, т.е. уже даже больше интересно как Вы все это составили? и как можно модифицировать скрипт. (подробности хорошо бы) |
|||
|
||||
ginnie |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 1 Всего: 49 |
Прошу прощения за задержку!
В моем первом варианте обнаружил ошибку. Я использовал статическую переменную, чтобы не затирать значения ключей в хэше на каждой итерации, это неверно, хэш должен быть пустым перед обработкой на каждой итерации. Вот исправленный вариант:
Чтобы обрабатывать парные теги, надо считать открывающие теги и закрывающие, для этого будем использовать хэш %tags_levels, ключами будут названия тегов. Решение задачи я сделал через регулярное выражение подстановки s///, когда регулярное выражение содержит символ '/', я обычно использую фигурные скобки в качестве ограничителей s{}{}. Для поиска открывающих и закрывающих тегов я использовал разные регулярные выражения: (?'tag'<(?'tag_name'\w+).*?>) и (?'tag'(?'tag_start'<?/)(?'tag_name'\w+)>), объединив их структурирующим метасимволом |. В этих регулярых выражениях захват подстроки я сделал с использованием именованных групп, чтобы можно было удобно обращатся с захваченному тексту по имени $+{group_name}, вместо обычного индекса $1, $2 и т.п. Т.е. вышеуказанные выражения эквивалентны (<(\w+).*?>) и ((<?/)(\w+)>), но использовать $1, $2 и $3 мне не так удобно. В секции замены я использовал Perl-код для анализа захваченного текста, поэтому для его выполнения в регулярном выражении необходимо добавить модификатор /e. Еще нужен модификатор /g для того, чтобы поиск и замена продолжались многократно, до самого конца строки. При нахождении открывающего тега инкрементируем значение ключа с именем тэга в хэше и заменяем подстроку с тэгом на нее же, т.к. никакие изменения нам не нужны. При нахождении закрывающего тега сначала проверяем, является ли он парным, для этого проверяем значение ключа в хэше, если тег не парный (значение равно 0 или неопределено), не обрабытываем его, заменяя найденную подстроку на нее саму. Если же тег парный, декрементируем значение в кэше для имени тега, проверяем наличие открывающей угловой скобки: если ее нет, то добавляем, если нет, то берем захваченный текст без изменений и заменяем им исходный. Мое решение плохо тем, что происходит замена подстроки для всех найденных тэгов, правильнее сделать вариант без замены, только поиском определять и сохранять позиции, в которые нужно вставить отсутствующие угловые скобки. После завершения поиска, выполнить вставку скобок в исходную строку. Этот вариант предлагаю Вам сделать самостоятельно. В случае возникновения трудностей буду рад помочь! Это сообщение отредактировал(а) ginnie - 18.12.2014, 22:23 -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
Сisa |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 179 Регистрация: 18.1.2013 Репутация: нет Всего: нет |
Комментарий помогает, особенно то, как он изложен.
Что код, что комментарий- все отлично. ginnie спасибо! |
|||
|
||||
Сisa |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 179 Регистрация: 18.1.2013 Репутация: нет Всего: нет |
Использование $+{group_name} или $1,$2,$3,$4,$5 и правда имеет свои отличия, но оба полезны для обучения. Последний вариант самый короткий, но как то приспособить его к восстановлению пропущенных символов </ а не только < наверно не получится, тут без Вашей конструкции с tags_levels не обойтись. А сделать вариант без полной замены, только поиском определять и сохранять позиции, в которые нужно вставить отсутствующие угловые скобки, и после завершения поиска, выполнить вставку скобок в исходную строку не сделаю т.к. не представляю себе его. Буду попробовать все же как то восстанавливать и < и </ для многострочного текста в одной конструкции с tags_levels или $1,$2,$3,$4,$5. |
|||
|
||||
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Регулярные выражения | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |