| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: Общие вопросы > Изобретаем велосипед |
| Автор: MakTpaxep 5.7.2011, 11:31 | ||||
| Всем привет. Задача:
Заменить на:
В принципе, задача для какого-нибудь xml'ного модуля, но интересно можно ли сделать одним регом? |
| Автор: alezzz 5.7.2011, 11:45 | ||
|
| Автор: afiskon 5.7.2011, 11:54 |
| http://eax.me/regular-expr/ |
| Автор: arto 5.7.2011, 12:42 |
| # print '<tag att="first"><tag att="second">asd</tag>qwe<tag att="second">asd</tag>zxc</tag>' | perl -plne 'while (s#<tag att="([^"]*)">((?:.(?!<tag))*?)</tag>#<$1>$2</$1>#) {};' <first><second>asd</first>qwe<second>asd</second>zxc</second> # |
| Автор: alezzz 5.7.2011, 12:43 | ||
почему? Добавлено через 3 минуты и 25 секунд arto, есть косяк. (?:.(?!<tag))* -- вот эту часть не могу вспомнить как правильно сделать, у Фридла было как-то по другому. |
| Автор: afiskon 5.7.2011, 12:47 | ||||
Мне вот тоже интересно. Во-первых, [a-z0-9] не идентично \w. Во-вторых, \d в perl 5.14 и \d в perl < 5.14 работают по-разному, так что если нужен [0-9], лучше писать [0-9]. |
| Автор: MakTpaxep 5.7.2011, 12:53 | ||||
Действительно. Как мы это будем решать? Или даже так
У меня вроде появились мысли с использованием рекурсии и модификатором e. Попробую сейчас оформить) Чтобы не раздувать код. Ещё когда utf8 входные - [a-z] не опишут всех букв) А [0-9] вроде эквивалентно \d, разве нет? |
| Автор: alezzz 5.7.2011, 13:07 | ||
Вот, кажется так точнее будет:
|
| Автор: arto 5.7.2011, 13:12 |
| неужели сложно проверить? # print '<tag att="first"><tag att="second">second 1</tag>first 1<tag att="second">second 2</tag>first 2</tag>' | perl -0777 -plne 's#<tag att="([^"]*)">((?:(?!<tag).)*?)</tag>#<$1>$2</$1>#gsm' <tag att="first"><second>second 1</second>first 1<second>second 2</second>first 2</tag> # |
| Автор: alezzz 5.7.2011, 13:15 | ||||
и в каком месте ошибка?
Добавлено через 2 минуты и 16 секунд я не через /g делал, а в цикле |
| Автор: MakTpaxep 5.7.2011, 14:34 |
| alezzz, спасибо. |
| Автор: MakTpaxep 2.11.2011, 19:00 | ||||||
Итого "<qwe att=2>aaaaa<1>bbbbbbbbb</qwe>cccccc</1>". Почему не получается? Пардон:
но тогда выходит
Без while не обойтись видимо... |
| Автор: alezzz 2.11.2011, 19:24 |
| без while этим способом не получится, модификатором global можно только ускорить |
| Автор: tishaishii 4.11.2011, 21:51 | ||
|
| Автор: tishaishii 5.11.2011, 00:35 | ||
|
| Автор: MakTpaxep 7.11.2011, 13:32 |
| tishaishii, спасибо, раскурю на досуге) |