Модераторы: ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Парсим лог прокси. замена пробела на _ 
V
    Опции темы
pirojok
Дата 3.11.2010, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 11.11.2007

Репутация: нет
Всего: нет



Добрый вечер.

Не могу сочинить регулярку для такой задачи:
если в строке обрамленной двойной ковычкой есть пробел его нужно заменить на _, остальные пробелы не трогать.

Вод исходная строка
Код

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"


предыстория задачи: http://forum.vingrad.ru/forum/topic-314141...0%BB%D1%8B.html

PM MAIL   Вверх
xido
Дата 4.11.2010, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 19.10.2010

Репутация: нет
Всего: нет



Код

sub rep 
{
 my $r=shift;
 $r=~s/\s/_/g;
 return $r;
}

$str=~s/("(\s*[^" ]*)*")/rep($1)/ge;
print $str,"\n";




PM MAIL WWW   Вверх
pirojok
Дата 4.11.2010, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 11.11.2007

Репутация: нет
Всего: нет



Спасибо, но как то оно не правильно работает.
функция rep не вызывается, так и пишет rep(значение переменной )
PM MAIL   Вверх
xido
Дата 4.11.2010, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL WWW   Вверх
Logo
Дата 4.11.2010, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 5
Всего: 10



Цитата

Код

("(\s*[^" ]*)*")


Опасно

Добавлено через 10 минут и 44 секунды
Хотя, именно в данном случае спасает оптимизатор. По крайней мерe в perl 5.10.
PM MAIL   Вверх
xido
Дата 4.11.2010, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 19.10.2010

Репутация: нет
Всего: нет



мм чем?
PM MAIL WWW   Вверх
Logo
Дата 4.11.2010, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 5
Всего: 10



В случае не совпадения регулярного выражения программа может повиснуть. Если используется НКА менханизм  регулярных выражений (perl совметимые к таковым относятся) нельзя составлять регулярку с вложенными  модификаторами повторения, так что бы были возможны различные интерпритации совпадения.  
Проще говоря вот некоторые варианты, которые  будут опробованны к строке. () Обозначено  то что совпадет с ("(\s*[^" ]*)*")
Код

"(123456789)
"(12345678)(9)
"(1234567)(89)
"(123456)(789)
"(12345)(6789)
"(123)(456789)
"(12)(3456789)
"(1)(23456789)
"(1234567)(8)(9)
и т.д. 
еще возможны пустые совпадения вроде "()(123456789)


Посмотрите вывод
Код

perl -e 'use re debug; q{"123456789}=~/"(\s*[^" ]*)*"/'

Здесь в perl 5.10 используется оптимизатор (заранее ищется кавычка в конце), поэтому до множественного перебора не доходит

Код

perl -e 'use re debug; q{"123456789}=~/"(\s*[^" ]*)*(?=")/'

Сдесь оптимизатор не работает, поэтому начинается обход строки, любуемся количеством команд. 
Количество операций растет с увеличением длинны строки, поэтому на достаточно длинной строке программа просто повиснет.

Это сообщение отредактировал(а) Logo - 5.11.2010, 19:05
PM MAIL   Вверх
pirojok
Дата 4.11.2010, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 11.11.2007

Репутация: нет
Всего: нет



Версия такая же (This is perl, v5.10.1 (*) built for i486-linux-gnu-thread-multi).
Походу я вас ввел в заблуждение, все работает.
Что-то сделал не правильно и перл ругался на модификатор e.


Спасибо большое.
PM MAIL   Вверх
xido
Дата 5.11.2010, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 19.10.2010

Репутация: нет
Всего: нет



В перл используются НКА ( в дка не может быть откатов насколько я понимаю), а еще у меня кавычка-то стоит ;)

Добавлено через 3 минуты и 48 секунд
Вообще в мою бытность работы сисадминов веб-хостинга,  я видел процесс апача, который потреблял 100% процессораи как показала отладка функцией pcre_что-то_там.

Проблема была в регулярке из .htacess, глупость была заметна невооруженным взглядом, а самое смешное что этот сайт принадлежал студии которая  разрабатывала и распространяла свой супер движок в состав которого этот .htaccess входил без изменений. 

PS в новых версиях libpcre входящей в апач можно задать максимальную глубину рекурсии.
PM MAIL WWW   Вверх
Logo
Дата 5.11.2010, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 5
Всего: 10



Да, верно НКА, опечатался.

Из-за кавычки в конце выражения perl как раз может оптимизировать поиск, и до множественных откатов дело не доходит. Но другая машина руглярных выражений может этого и не уметь.
PM MAIL   Вверх
xido
Дата 5.11.2010, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 19.10.2010

Репутация: нет
Всего: нет



Есть идеи как напистаь эту регулярку оп другому?

И кстати, есть ли в природе компиляторы регэкспов (в каких-нибудь языках или отдельно) которые бы работали как ДКА? Ну или хотя бы компилировали НКА в ДКА, хотя тут пропадут многие плюшки. С другой стороны я лично этими плюшками (типа ?smile никогда и не пользовался.


PM MAIL WWW   Вверх
Logo
Дата 7.11.2010, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 5
Всего: 10



Ваша регулярка по смыслу эквивалентна
Код

$str=~s/("[^"]*")/rep($1)/ge;


Вообще же при вложенных циклах можно либо исползовать захватывающие квантификаторы ++ *+ (в perl 5.8 и ниже, и д.р. где они сами не поддерживаются, используется атомарная группировка (?>x+)  ), либо переписать регулярку так, чтобы двусмысленных выражений небыло. Хороший пример "Раскрутка цикла" из книги Фридла.

ДКА используются в MySQL, вероятно используются в unix утилитах, есть разные C либы ДКА выражений. Tcl использует смешаный механизм.
Perl 5.10 позволяет создавать свою машину регулярных выражений,  поэтому можно поискать бинды к либам на cpan http://search.cpan.org/search?query=re%3A%3A&mode=all
PM MAIL   Вверх
awkward
Дата 26.1.2011, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Код

$str =~ s!(".*?")!sub{ ($_) = @_; tr/ /_/; $_ }->($1)!ge;

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Регулярные выражения | Следующая тема »


 




[ Время генерации скрипта: 0.0578 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.