Попробуйте в начале программы установить подходящую локализацию
(Вы же не пишете, какая ОС, какой кодировкой русского пользуетесь и т.п.),
т.е. вызвать setlocale()
с нужными аргументами.
Если локализация среды исполнения правильно установлена, то обычно достаточно просто написать:
setlocale(LC_ALL, "");
(по крайней мере для glibc и regexec()).
Обновление
Да, там в крестах регэкспы до сих пор не работают. Посмотрите на regcomp/regexec (man 3 regcomp)
.
UPDATE 2
Работающий пример без учета регистра символов.
avp@avp-xub11:hashcode$ cat regicase.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <locale.h>
#include <sys/types.h>
#include <regex.h>
int
main (int ac, char *av[])
{
setlocale(LC_ALL, "");
printf("%s\n", setlocale(LC_ALL, 0));
char str[1000];
regex_t pr;
int err = regcomp(&pr, ".*Я[а-е]*[1-9].*", REG_EXTENDED | REG_ICASE);
if (err) {
regerror(err, &pr, str, 100);
puts(str);
exit(1);
}
while (fputs("enter: ", stderr), fgets(str, 1000, stdin)) {
printf ("match = %d\n", regexec(&pr, str, 0, 0, 0));
}
return 0;
}
avp@avp-xub11:hashcode$ g++ regicase.c
avp@avp-xub11:hashcode$ ./a.out
en_US.UTF-8
enter: qwe
match = 1
enter: QWE
match = 1
enter: ЯВ333
match = 0
enter: ява222
match = 0
enter: язь12
match = 1
enter: avp@avp-xub11:hashcode$ g++ --version
g++.real (Ubuntu 4.8.2-19ubuntu1) 4.8.2
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
avp@avp-xub11:hashcode$