Регулярные выражения и кириллица

Рейтинг: 1Ответов: 1Опубликовано: 02.10.2014

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

std::string search("(?i)(.*)(ТЕКСТ ДЛЯ ПОИСКА)(.*)");
boost::regex regEx(search);
boost::smatch results;
if (boost::regex_match(name, results, regEx, boost::regex_constants::match_default))
....

Только вот данный код работает только с латиницей. Заранее спасибо

Обновление

Система Ubuntu 12.04 LTS i386, kernel 3.10.1-pf. Компилятор gcc (g++) 4.6.3. Кодировка UTF-8. Проект Qt Widgets Desktop.
P.S. Установка локали не помогла.

Ответы

▲ 1

Попробуйте в начале программы установить подходящую локализацию

(Вы же не пишете, какая ОС, какой кодировкой русского пользуетесь и т.п.),

т.е. вызвать 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$