Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: регулярные выражения  (Прочитано 14246 раз)
0 Пользователей и 1 Гость смотрят эту тему.
xelos
Гость
« : 16-03-2005 09:32 » 

по необходимости искал информацию о регулярных выражениях и наткнулся на очень интересный сайт - очень хорошее введение, понятно и общедоступно.
Вкратце - регулярные выражения позволяют осуществлять расширенный текстовый поиск. Формируется шаблон, по которому и ищутся строки соответствующие шаблону. grep работает именно на них, как я понял.
Чтобы использовать регулярные выражения, необходимо использовать соответствующий движок (или самому его написать). Такие движки интегрированы в .NET, JDK 1.4, perl и т.д. Что означает что при использовании этих технологий можно пользовать регулярные выражения безболезненно.

в общем, может пригодится кому:
http://www.regular-expressions.info/
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 16-03-2005 12:05 » 

Коли интегрированы, то что мешает использовать?
Кстати, хочу подметить, что не все regexp-ы имеют одинаковый формат. Помимо стандартов типа POSIX и PCRE есть различные диалекты - стоит сверится с документацией на конкретные API.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
xelos
Гость
« Ответ #2 : 16-03-2005 15:27 » 

имеется ввиду что в MFC, например, движка нет. Так что придется своими силами реализовывать или использовать чужой.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 17-03-2005 11:08 » 

В MFC я не разбираюсь - может там и есть какой-нибудь сторонний компонент для regexp-ов.

Могу порекомендовать библиотеку pcre. Объектного интерфейса в ней нет - расчитана на С. Работает с кодировками согласно локали. Основное что нужно: pcre_compile() и pcre_match(). Может сверять строку с шаблоном, вырезать подстроки и т.п. На ее базе есть библиотека pcrs - выполняет то же, что и оператор s/// в perl-е - замену подстрок.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 16-08-2009 07:43 » 

Интересный факт, что на просторах рунета это единственное упоминание "библиотека pcrs" с темой о программировании. В не-рунете дела еще хуже обстоят. Забавно, что я нашел свой же пост, 4.5 лет давности. Улыбаюсь
Правда, инфы тут не густо и чтобы в следующий раз я ее таки здесь нашел, пишу:...

Библиотека PCRS (PCRE Substitution) — аналог оператора s/// в Perl. Предназначена для поиска и замены строк по шаблону.
В отдельной форме, судя по всему, существовала только в самых ранних версиях. Изначально была написана для проекта privoxy.org и поставляется в его исходниках как вкомпилируемый модуль.

В атаче прилагаю версию 1.29, взятую мною из пакета pryvoxy-3.0.12 и лишенную ненужных внутрипакетных зависимостей. Также прилагается реализация snprintf() для систем, где нет этой функции.

Сборка с GCC:

gcc -Wall -O2 -fPIC -c pcrs.c
gcc -Wall -shared -Wl,-soname,libpcrs.so.1 -o libpcrs.so.1 pcrs.o -lpcre


* pcrs.c (40 Кб - загружено 824 раз.)
* pcrs.h (7.78 Кб - загружено 857 раз.)
* snprintf.c (28.38 Кб - загружено 822 раз.)
* snprintf.h (0.12 Кб - загружено 811 раз.)
« Последнее редактирование: 16-08-2009 07:45 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #5 : 16-08-2009 09:28 » 

Тогда тему в ЧАВО
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 16-08-2009 09:40 » 

Жень, погоди - может еще материал в тему напишу. Я задался тут расширить MySQL недостающими функциями через UDF-интерфейс. Пробую сделать функцию REGEXP_REPLACE - в MySQL есть только REGEXP (он же RLIKE) для тестирования строки, но нет ничего для замены по шаблону. Первый блин уже работает, но есть проблемы с CASELESS для UTF-8.

Сборка:
Код:
gcc -Wall -O2 -fPIC -c regexp_replace.c
gcc -Wall -shared -Wl,-soname,libregexp_replace.so -o libregexp_replace.so regexp_replace.o -lpcre -lpcrs
mkdir /usr/local/lib/mysql
cp libregexp_replace.so /usr/local/lib/mysql
ldconfig /usr/local/lib/mysql

Установка (имя функции в нижнем регистре!):

Код:
CREATE FUNCTION regexp_replace RETURNS STRING SONAME 'libregexp_replace.so';

* regexp_replace.c (2.18 Кб - загружено 839 раз.)
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Mayor
Специалист

ru
Offline Offline

« Ответ #7 : 16-08-2009 09:54 » 

имеется ввиду что в MFC, например, движка нет. Так что придется своими силами реализовывать или использовать чужой.

хм давненько не слышал про mfc, как и про попытки своими силами реализовать неучебный проект РВ

зы начинал пользоваться posix standart, потом pcre, потом posix extend. , немного почитал python_re - вроде особых различий от posix e не увидел и уже не пригодилось

у меня вопрос, кому какая реализация больше понравилась?:
boost.regex
boost.expressive
Gregex  (glib)
pcre
qRegEx (qt)
regex - какая то спенсеровская либа, хз в состав какой библиотеки входит

какой из 3х алгоритмов RE щас считается наиболее преспективным?
Записан

1n c0de we trust
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 16-08-2009 10:09 » 

хм давненько не слышал про mfc

"Mayor не слышал" - это не показатель Отлично
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 16-08-2009 11:11 » 

Mayor, никакой - они не развиваются (и слава богу!).

Если говорить, какой мощнее и удобнее, то PCRE. Реализаций полно и сравнивать их смысла не вижу.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 16-08-2009 13:55 » 

Разобрал вопрос о поддержке UTF-8 и Unicode в libpcre: если при компиляции конфигуратору было сказано --with-utf8, то многобайтные символы распознаются, но классы \w [:alpha:] и т.п. не-ASCII коды не признают. Оказалось, что это нормальное явление, что и сказано в документации.
В качестве компенсации есть поддержка метаконструкций \p и \P - для работы с классами юникодных символов. Как-то странно, что библиотека pcre из комплекта CentOS (и RHEL) собрана без этой поддержки.
Лечится легко:

1. Скачиваем src.rpm из дистрибутива и устанавливаем его.
2. В /usr/src/redhat/SPECS находим файлик pcre.spec, в котором находим строку "%build", а за ней - строка, начинающаяся с "%configure". Внесим в нее изменение:
%configure --enable-utf8 --enable-unicode-properties
3. Собираем бинарный rpm:
$ rpmbuild -bb pcre.spec
4. В директории /usr/src/redhat/RPMS/<platform>/ будут лежать собранные пакеты cpre и cpre-devel - устанавливаем их через rpm -U <package>.

Теперь мы можем "поймать" любое юникодное слово: вместо \w+ делаем \pL+



Последний атач (regexp_replace.c) оказался полностью рабочим. Разве что есть орфографические ляпы в сообщениях об ошибках.
« Последнее редактирование: 16-08-2009 13:58 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 16-08-2009 14:11 » 

Для желающих потестить или даже попользоваться - уже собранные библиотеки для CentOS 5/RHEL 5.

libpcrs поместить в /usr/local/lib
libregexp_replace - в /usr/local/lib/mysql

После выполнить ldconfig и рестартовать mysqld.

* libpcrs.so.1 (14.89 Кб - загружено 792 раз.)
* libregexp_replace.so (5.66 Кб - загружено 785 раз.)
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines