LINUX.ORG.RU

regex


0

0

#include <regex.h> //------------- Регулярные выражения -------- int feregi(const char *war,char *serch, int icase) {

if(!war || !serch) { i_error(" No 1 or 2 argument"); return 0; }

regex_t re; int copts = REG_EXTENDED; int reerrcode; /* Код ошибки от regcomp или regexec */ char reerrbuf [60]; /* Буфер для строк с сообщениями об ошибках */

if (icase) copts |= REG_ICASE;

reerrcode = regcomp(&re, serch, copts);

if (reerrcode) { regerror(reerrcode, &re, reerrbuf, sizeof (reerrbuf)); regfree (&re); i_error(E_WARNING, " \"%s\" : \"%s\"", reerrbuf,serch); return 0; } reerrcode = regexec(&re, war, 0, NULL, 0); regfree (&re);

if (!reerrcode) { return 1; } else return 0;

}

В чём проблема: Если сделать так: feregi("g","G",1); он находит подстраку в строке и возвращает 1. А если так: feregi("п","П",1); OR feregi("пАпа","ПАПа",1); он почему-то возвращает 0. setlocal не помогает! :(

anonymous

Some people, when confronted with a problem, think “I know, I’ll use regular expressions.” Now they have two problems.

anonymous
()

>setlocal не помогает! :(

Странно, у меня с "setlocale(LC_CTYPE, "ru_RU.KOI8-R")" feregi("пАпа","ПАПа",1) дает 1. Какая у вас локаль, версия libc и т.д.

P.S. зачем REG_EXTENDED ? И вобще, идея использовать regex для поиска подстрок кажется странной...

mky ★★★★★
()
Ответ на: комментарий от mky

это, похоже - каки с utf.

присоединяюсь к пожеланию use pcre

ananas ★★★★★
()
Ответ на: комментарий от mky

feregi("пАпа","ПАПа",1) это простой пример, там и синтаксис не работает.

anonymous
()
Ответ на: комментарий от anonymous

У меня нет локали ru_RU.windows-1251, я сделал локаль ru_RU.CP1251 командой

# localedef -i ru_RU -f CP1251 /usr/lib/locale/ru_RU.CP1251

Пример работате, если setlocale(LC_CTYPE, "ru_RU.CP1251"). Вызывать setlocale нужно обязательно, либо с LC_ALL либо с LC_CTYPE и проверять результать вывода. Без этого REG_ICASE не будет работать для букв русского алфавита и других, не английских алфавитов.

mky ★★★★★
()
Ответ на: комментарий от mky

Блин, к ночи глаза уже совсем не видят :(

s/Пример работате/Пример работает как надо/

s/результать вывода/результат вызова/

То есть, подозреваю, что у вас проблемы с локалью...

mky ★★★★★
()
Ответ на: комментарий от anonymous

Как говорится, "мамой клянусь", у меня setlocale(LC_CTYPE, "ru_RU.KOI8-R") возвращает "ru_RU.KOI8-R"...

команда localedef у вас не ругалась? Может надо было "# # localedef -i ru_RU -f CP1251 ru_RU.CP1251", тогда эта локаль просто добавится в файл locale-archive. Возможно, что локали у вас находятся не в каталоге /usr/lib/locale/. Я проверял на старой системе, где в основе RedHat 9.0

Посмотрите, работате ли "# ( export LC_CTYPE=RU.CP1251; grep -i пАпа "файл, содержащий 'папа' в Windows-1251" ) " --- то есть проверить на "образцовой" программе (grep) работу с локалями. Может у вас установлена ru_RU.windows-1251... Что, кстати, говорит " $ echo $LC_ALL " ?

Сделайте strace "ваш тестовый бинарник" и посмотрите, какой путь используется при open("XXXXXX/locale-archive"), и какие файлы пробуются потом.

В общем, пока я остаюсь при своем мнении, что у вас проблемы с локалью...

P.S. Сейчас меня сильно загрузили на работе, поэтому я могу отвечать в данной теме только раз сутки...

mky ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.