![]() |
|
Модераторы: ginnie |
![]()
|
|
| pirojok |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 11.11.2007 Репутация: нет Всего: нет |
Добрый вечер.
Не могу сочинить регулярку для такой задачи: если в строке обрамленной двойной ковычкой есть пробел его нужно заменить на _, остальные пробелы не трогать. Вод исходная строка
предыстория задачи: http://forum.vingrad.ru/forum/topic-314141...0%BB%D1%8B.html |
|||
|
||||
| xido |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 19.10.2010 Репутация: нет Всего: нет |
|
|||
|
||||
| pirojok |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 11.11.2007 Репутация: нет Всего: нет |
Спасибо, но как то оно не правильно работает.
функция rep не вызывается, так и пишет rep(значение переменной ) |
|||
|
||||
| xido |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 19.10.2010 Репутация: нет Всего: нет |
модификаторы /ge указали? какая версия перл?
oxid@ ~> perl ./testreg.pl REP!!! REP!!! 1288656667.945 26 10.50.65.8 TCP_MISS/200 326 GET http://win.mail.ru "sdlfsk_sklflasdfjasd" DIRECT/win.mail.ru text/plain DEFAULT_CASE-C-OfficeNetworks-NONE-NONE-DefaultRouting <Web-,3.2,0,-,-,-,-,0,-,-,-,-,-,-,-,Web-,-> - "sdasd_kldfgdslfkgdslfg" oxid@ ~> perl --version This is perl, v5.10.1 (*) built for x86_64-linux-gnu-thread-multi (with 47 registered patches, see perl -V for more detail) Это сообщение отредактировал(а) xido - 4.11.2010, 11:43 |
|||
|
||||
| Logo |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: 5 Всего: 10 |
Опасно Добавлено через 10 минут и 44 секунды Хотя, именно в данном случае спасает оптимизатор. По крайней мерe в perl 5.10. |
||||
|
|||||
| xido |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 19.10.2010 Репутация: нет Всего: нет |
мм чем?
|
|||
|
||||
| Logo |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: 5 Всего: 10 |
В случае не совпадения регулярного выражения программа может повиснуть. Если используется НКА менханизм регулярных выражений (perl совметимые к таковым относятся) нельзя составлять регулярку с вложенными модификаторами повторения, так что бы были возможны различные интерпритации совпадения.
Проще говоря вот некоторые варианты, которые будут опробованны к строке. () Обозначено то что совпадет с ("(\s*[^" ]*)*")
Посмотрите вывод
Здесь в perl 5.10 используется оптимизатор (заранее ищется кавычка в конце), поэтому до множественного перебора не доходит
Сдесь оптимизатор не работает, поэтому начинается обход строки, любуемся количеством команд. Количество операций растет с увеличением длинны строки, поэтому на достаточно длинной строке программа просто повиснет. Это сообщение отредактировал(а) Logo - 5.11.2010, 19:05 |
||||||
|
|||||||
| pirojok |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 11.11.2007 Репутация: нет Всего: нет |
Версия такая же (This is perl, v5.10.1 (*) built for i486-linux-gnu-thread-multi).
Походу я вас ввел в заблуждение, все работает. Что-то сделал не правильно и перл ругался на модификатор e. Спасибо большое. |
|||
|
||||
| xido |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 19.10.2010 Репутация: нет Всего: нет |
В перл используются НКА ( в дка не может быть откатов насколько я понимаю), а еще у меня кавычка-то стоит ;)
Добавлено через 3 минуты и 48 секунд Вообще в мою бытность работы сисадминов веб-хостинга, я видел процесс апача, который потреблял 100% процессораи как показала отладка функцией pcre_что-то_там. Проблема была в регулярке из .htacess, глупость была заметна невооруженным взглядом, а самое смешное что этот сайт принадлежал студии которая разрабатывала и распространяла свой супер движок в состав которого этот .htaccess входил без изменений. PS в новых версиях libpcre входящей в апач можно задать максимальную глубину рекурсии. |
|||
|
||||
| Logo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: 5 Всего: 10 |
Да, верно НКА, опечатался.
Из-за кавычки в конце выражения perl как раз может оптимизировать поиск, и до множественных откатов дело не доходит. Но другая машина руглярных выражений может этого и не уметь. |
|||
|
||||
| xido |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 19.10.2010 Репутация: нет Всего: нет |
Есть идеи как напистаь эту регулярку оп другому?
И кстати, есть ли в природе компиляторы регэкспов (в каких-нибудь языках или отдельно) которые бы работали как ДКА? Ну или хотя бы компилировали НКА в ДКА, хотя тут пропадут многие плюшки. С другой стороны я лично этими плюшками (типа ? |
|||
|
||||
| Logo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: 5 Всего: 10 |
Ваша регулярка по смыслу эквивалентна
Вообще же при вложенных циклах можно либо исползовать захватывающие квантификаторы ++ *+ (в perl 5.8 и ниже, и д.р. где они сами не поддерживаются, используется атомарная группировка (?>x+) ), либо переписать регулярку так, чтобы двусмысленных выражений небыло. Хороший пример "Раскрутка цикла" из книги Фридла. ДКА используются в MySQL, вероятно используются в unix утилитах, есть разные C либы ДКА выражений. Tcl использует смешаный механизм. Perl 5.10 позволяет создавать свою машину регулярных выражений, поэтому можно поискать бинды к либам на cpan http://search.cpan.org/search?query=re%3A%3A&mode=all |
|||
|
||||
| awkward |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
|
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Регулярные выражения | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |