1

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

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
  • Обновил ответ
    – avp
    2 окт 2014 в 8:21

1 ответ 1

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$
5
  • В смысле boost::regex ?
    – crymchanin
    2 окт 2014 в 9:18
  • 1
    В смысле ни boost, ни stl (у меня по крайней мере) в g++.real (Ubuntu 4.8.2-19ubuntu1) 4.8.2 с кириллицей в utf-8 не работает. -- А вот обычные C-шные regcomp/regexec (см. man 3 regcomp) даже без установки setlocale(LC_ALL, "ru_RU.utf8"); // а по умолчанию у меня locale en_US.UTF-8 работают, как оттранслированные gcc, так и g++.
    – avp
    2 окт 2014 в 10:23
  • 1
    Перечитал вопрос и перепроверил. Да, для работы без учета регистра символов setlocale() нужен!!! Сейчас напишу пример в UPD ответа.
    – avp
    2 окт 2014 в 11:24
  • Спасибо за помощь.
    – crymchanin
    2 окт 2014 в 12:27
  • Нашел решение проблемы: 1) Установить поддержку Unicode ICU и библиотеки: через репозитории (при наличии) либо скачав с сайта: site.icu-project.org/download 2) Выполнить построение BOOST с поддержкой Unicode: ./bjam -sICU_PATH=/usr/share/icu/52.1 --toolset=gcc install 3) Включить в проект библиотеку libicuuc.so Ну и собственно код: std::string search("(?i)(.*)(ТЕКСТ ДЛЯ ПОИСКА)(.*)"); boost::u32regex regEx = boost::make_u32regex(search); boost::smatch results; if (boost::u32regex_match(search_string, results, regEx, boost::regex_constants::match_default)) ...
    – crymchanin
    2 окт 2014 в 14:53

Ваш ответ

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge you have read our privacy policy.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками или задайте свой вопрос.