Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: Регулярные выражение в С++ с использованием библиотеки pcre  (Прочитано 2836 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Akum

  • Автор темы
  • Новичок
  • *
  • Сообщений: 35
    • Просмотр профиля
Здравствуйте!
Пишу на с++ в codebloks возникла задача распарсить  текст  вот по такому выражению /\w+.\/\/\w+\d+\.\w+\.\w+\/\w+-.+\.\w Использую библиотеку pcre
Вот как пишу:

char regx[] = "/\w+.\/\/\w+\d+\.\w+\.\w+\/\w+-.+\.\w";
 pcre *re;
    int options = 0;
    const char *error;
    int erroffset;
    re = pcre_compile (regx, options, &error, &erroffset, NULL);
count = pcre_exec (re, NULL,  buffer.c_str(),buffer.length(), 0, 0, ovector, 30);  //buffer - это и есть переменная с текстом
if (count< 0)
                {
                    switch(count)
                    {
                    case PCRE_ERROR_NOMATCH:
                        cout << "Нет совпадений" << endl;
                        return -1;
                    default:
                        cout << "Ошибка : " <<count <<endl;
                        return -1;
                    }
                    free(re);  
                    return 1;
                }
                else
                {
                    for (int c = 0; c < 2 * count; c += 2)
                    {
                        if (ovector[c] < 0)
                        {
                            cout << "\n";
                        }
                        else
                        {
                            cout << ovector[c] << "/" << ovector[c + 1] << "\n";
                        }
                    }
                }
Выдает постоянно что нет совпадений но вроде выражение правильное , может что-то в коде не так или  выражение надо как то по другому записать ?
« Последнее редактирование: 24 Декабря 2009, 14:09:59 от Akum »
Ubuntu 9.10 x64 / P5K Premium / E660 / DDR2*3G / 8600GTS / HDD 750G
Ubuntu-Server 9.10 x86 / Celerom 2.66 / DDR2*1.5G / ati9950 / HDD 3Tб

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: Регулярные выражение в С++ с использование
« Ответ #1 : 24 Декабря 2009, 14:39:06 »
Для информации надо несколько строчек, в которых Вы хотите найти совпадения.
Для любого шаблона найдется совпадение где-нибудь. ;D
« Последнее редактирование: 24 Декабря 2009, 14:49:31 от alexander.pronin »

Оффлайн Akum

  • Автор темы
  • Новичок
  • *
  • Сообщений: 35
    • Просмотр профиля
Вот кусок текста которы надо распарсить
(Нажмите, чтобы показать/скрыть)
вот это надо достать : http://fileshare245.depositfiles.com/auth-1261655739bede5d845b7b1f335a0176-95.158.205.93-969473376-34511674-guest/FS245-8/x_zone.rar

Ubuntu 9.10 x64 / P5K Premium / E660 / DDR2*3G / 8600GTS / HDD 750G
Ubuntu-Server 9.10 x86 / Celerom 2.66 / DDR2*1.5G / ati9950 / HDD 3Tб

Оффлайн Mam(O)n

  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
Проблема в том, что ескейп символ, применяющийся в regexp в си тоже используется с тем же назначением. Хотя, если не брать это в расчёт, то выражение всё равно не работает. В общем вот, попробуй такое: "http://\\w+.depositfiles.com/[^\"]*"

Оффлайн Akum

  • Автор темы
  • Новичок
  • *
  • Сообщений: 35
    • Просмотр профиля
Цитировать
"http://\\w+.depositfiles.com/[^\"]*"
тоже не работает.
Может он правда с ескейп символами не дружит может они не подаются в функцию?
Ubuntu 9.10 x64 / P5K Premium / E660 / DDR2*3G / 8600GTS / HDD 750G
Ubuntu-Server 9.10 x86 / Celerom 2.66 / DDR2*1.5G / ati9950 / HDD 3Tб

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
А если слеши в http:// экранировать?

"http:\\/\\/\\w+.depositfiles.com\\/[^\"]*"

В перле все получается.
$ perl -e '$_="a=\"http://fileshare245.depositfiles.com/auth-1261655739bede5d845b7b1f335a0176-95.158.205.93-969473376-34511674-guest/FS245-8/x_zone.rar\""; print "\n",/http:\/\/\w+.depositfiles.com\/[^\"]*/,"\n"'

1

Рекомендую поставить kiki или kodos, они, правда, для питона, но все равно помогут. Все есть в официальных репозиториях.
А для того, чтобы достать совпавшее значение, надо регэксп взять в круглые скобки, а потом запомнить переменную $1
Если будут две пары скобок (не вложенных), можно будет работать с $1 и $2

После недолгого гуглевания обнаружилось вот это: http://www.tolaris.com/apt-repository/
Там есть kregexpeditor, невинно удаленный из оф. репозиториев после перехода на КДЕ4.  Весьма рекомендую - лучшее, что я видел.
« Последнее редактирование: 24 Декабря 2009, 16:54:14 от wl »
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн Mam(O)n

  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
Цитировать
"http://\\w+.depositfiles.com/[^\"]*"
тоже не работает.

У меня работает:
(Нажмите, чтобы показать/скрыть)
(Нажмите, чтобы показать/скрыть)

Код: (./ctest) [Выделить]
mamon@mamon-desktop:~/tmp/ct$ ./ctest
Найдено: http://fileshare245.depositfiles.com/auth-1261655739bede5d845b7b1f335a0176-95.158.205.93-969473376-34511674-guest/FS245-8/x_zone.rar


Пользователь решил продолжить мысль 24 Декабря 2009, 03:15:35:
Пля. Только заметил плюсы (++). Но сути не меняет. Мой вариант выражения работает 100%.

Пользователь решил продолжить мысль 24 Декабря 2009, 07:20:05:
ЗыМля. Как же всётаки выбешивает автоматическая замена в блоке [сode][/сode] сочетания \n на реальный перевод строки...
ЗызыМля. Как оказалось вообще всех эскейпов. Такчто, КМК, у топикстартера в первом топике форум тоже подъел regexp!!

Разобрался с глюками. Возникают после того, как посты сливаются под предлогом "Пользователь решил продолжить мысль". Так что, народ, будьте осторожны..
« Последнее редактирование: 24 Декабря 2009, 17:47:44 от Mam(O)n »

Оффлайн Akum

  • Автор темы
  • Новичок
  • *
  • Сообщений: 35
    • Просмотр профиля
Цитировать
"http://\\w+.depositfiles.com/[^\"]*"
тоже не работает.

У меня работает:
(Нажмите, чтобы показать/скрыть)
(Нажмите, чтобы показать/скрыть)

Код: (./ctest) [Выделить]
mamon@mamon-desktop:~/tmp/ct$ ./ctest
Найдено: http://fileshare245.depositfiles.com/auth-1261655739bede5d845b7b1f335a0176-95.158.205.93-969473376-34511674-guest/FS245-8/x_zone.rar


Пользователь решил продолжить мысль 24 Декабря 2009, 03:15:35:
Пля. Только заметил плюсы (++). Но сути не меняет. Мой вариант выражения работает 100%.

Пользователь решил продолжить мысль 24 Декабря 2009, 07:20:05:
ЗыМля. Как же всётаки выбешивает автоматическая замена в блоке [сode][/сode] сочетания \n на реальный перевод строки...
ЗызыМля. Как оказалось вообще всех эскейпов. Такчто, КМК, у топикстартера в первом топике форум тоже подъел regexp!!

Разобрался с глюками. Возникают после того, как посты сливаются под предлогом "Пользователь решил продолжить мысль". Так что, народ, будьте осторожны..

Спасибо большое  работает! :D
Ubuntu 9.10 x64 / P5K Premium / E660 / DDR2*3G / 8600GTS / HDD 750G
Ubuntu-Server 9.10 x86 / Celerom 2.66 / DDR2*1.5G / ati9950 / HDD 3Tб

 

Страница сгенерирована за 0.021 секунд. Запросов: 21.