Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
4 / 4 / 0
Регистрация: 10.01.2012
Сообщений: 43
1

Регулярные выражения аналог preg_match в C++ Builder

09.04.2012, 12:17. Просмотров 2864. Ответов 9
Метки нет (Все метки)

Появилась необходимость в регулярных выражениях.
И решил на будущее сделать аналог из PHP - preg_match.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <pcreposix.h>
#include <sys/types.h>
#include <vector>
using namespace std;
 
int preg_match(String pattern, String subject, vector <String> &matches, int flags = 0) {
    regex_t re;
    regmatch_t substrings[10];
    char sBuff[50],
        *regexpString   = pattern.c_str(),
        *testString     = subject.c_str();
    int i, result;
 
    matches.clear();
 
    if( (result=regcomp(&re, regexpString, flags))!=0 ) {   // REG_ICASE
        return result;
    }
    if( (result=regexec(&re, testString, sizeof(substrings)/sizeof(substrings[0]), substrings, 0))!=0 ) {
        return result;
    }
 
    for(i=1; i<=re.re_nsub; i++) {
        memcpy(sBuff, &testString[substrings[i].rm_so], substrings[i].rm_eo - substrings[i].rm_so);
        sBuff[substrings[i].rm_eo - substrings[i].rm_so] = 0;
        matches.push_back(Trim((char*)sBuff));
    }
 
    regfree(&re);
    return 0;
}
В общем как то с типами данных фигово идёт, помогите сделать резиновую функцию, чтобы не было ограничения на вывод:
C++
1
2
    regmatch_t substrings[10];
    char sBuff[50];
Вот эти две переменные надо сделать резиновыми под тип:
C++
1
2
    regmatch_t *substrings;
    char *sBuff;
Как это сделать?

Добавлено через 2 минуты
Да кстати сама по себе в данном варианте она работает.
C++
1
preg_match(Edit1->Text.c_str(), Edit2->Text.c_str(), matches, REG_ICASE);
Но бывает что не известно сколько matches надо вывести
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.04.2012, 12:17
Ответы с готовыми решениями:

Регулярные выражения C++ Builder XE3
Помогите, пожалуйста. Перечитал уже кучу форумов и советов. Необходимо в StringList проверить i-тую...

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

ЧПУ. Замена строк, регулярные выражения. Как правильно использовать переменную в регулярные выражения ?
Здравствуйте! Решил реализовать ЧПУ на своем сайте. Первый этап это замена всех реальных ссылок на...

Preg_match php аналог javascript
Ниже php работающий как надо, попытался на javascript такой же написать, но почему-то возвращает...

9
595 / 563 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
09.04.2012, 12:17 2
чем не устраивает boost:regex он же std::regex из с++11 ?
0
4 / 4 / 0
Регистрация: 10.01.2012
Сообщений: 43
09.04.2012, 14:51  [ТС] 3
а чем стандартная хуже? тем более не надо ничего скачивать, всё под рукой

Добавлено через 2 часа 25 минут
В принципе я сам уже сделал, кому интересно потестить:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <pcreposix.h>
#include <sys/types.h>
#include <vector>
using namespace std;
 
int preg_match(String pattern, String subject, vector <String> &matches, int flags = 0) {
    String text = subject;
    regex_t re;
    int i = 0, result = 0, countPatern = 5, len = text.Length();
 
    for(i=1; i<len; i++) if( PChar(text[i])=="(" ) countPatern++;
    regmatch_t *substrings = new regmatch_t[countPatern];
    matches.clear();
 
    if( (result=regcomp(&re, pattern.c_str(), flags))!=0 ||
        (result=regexec(&re, subject.c_str(), countPatern, &substrings[0], 0))!=0 )
        return result;
 
    for(i=1; i<=re.re_nsub; i++) {
        matches.push_back(text.SubString(substrings[i].rm_so+1, substrings[i].rm_eo-substrings[i].rm_so));
    }
 
    regfree(&re);
    return 0;
}
10000 итераций за 203 миллисекунды
0
В астрале
Эксперт С++
8028 / 4785 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
09.04.2012, 14:56 4
chuvak2008f, std::regex это и есть стандартная.
0
4 / 4 / 0
Регистрация: 10.01.2012
Сообщений: 43
09.04.2012, 17:09  [ТС] 5
Цитата Сообщение от ForEveR Посмотреть сообщение
chuvak2008f, std::regex это и есть стандартная.
Поздно я уже preg_matсh навтыкал в своём проекте
Раз уж начала давай подробнее о std::regex, как её оживить?
0
В астрале
Эксперт С++
8028 / 4785 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
09.04.2012, 18:27 6
chuvak2008f, Что значит оживить?) В gcc (4.6.1) поддержка регексов кажется еще не реализована (точнее реализована, но стоит затычка кидающая эксепшн), так что пока только boost::regex. В MSVC хз реализована или нет. Так что...
0
4 / 4 / 0
Регистрация: 10.01.2012
Сообщений: 43
09.04.2012, 18:42  [ТС] 7
Цитата Сообщение от ForEveR Посмотреть сообщение
chuvak2008f, Что значит оживить?) В gcc (4.6.1) поддержка регексов кажется еще не реализована (точнее реализована, но стоит затычка кидающая эксепшн), так что пока только boost::regex. В MSVC хз реализована или нет. Так что...
У меня сейчас стоит, CodeGear RAD Studio 2009 он же билдер 2009, удобная вещь для скоростного создания прог в отличии от студии VC++.
Так вот, как мне запустить отработку рега у меня которую советуете boost::regex
0
В астрале
Эксперт С++
8028 / 4785 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
09.04.2012, 19:45 8
chuvak2008f, Поставить буст. Только так. Компилятор то у вас какой стоит?
0
4 / 4 / 0
Регистрация: 10.01.2012
Сообщений: 43
14.04.2012, 00:54  [ТС] 9
Цитата Сообщение от ForEveR Посмотреть сообщение
chuvak2008f, Поставить буст. Только так. Компилятор то у вас какой стоит?
А тут я понятия не имею, какой поставился такой и работает. Ну вот тем более, ещё скачивать, я уж проект замутил на своём прег_матче, все работает отлично, ничего лишнего. У меня ещё есть explode )
это я так поклонник PHP, наверное самый удобный язык программирования. Несколько лет на нём сидел) Нужда вынудила опять к билдеру вернуться
0
Эксперт С++
8341 / 6090 / 607
Регистрация: 10.12.2010
Сообщений: 28,325
Записей в блоге: 29
14.04.2012, 03:38 10
Builder2009 идет вместе с boost-ом правда версия старая, но regex работает вроде нормально.
Как вариат можно установить boost через инсталятор ( под VC++) опробовано только пути прописать и старый убрать
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.04.2012, 03:38

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

Регулярные выражения - вывод сообщения об ошибке при нахождении в строке выражения, начинающегося с цифры
Нужно чтобы при нахождении в строке выражения начинающегося с цифры появлялось сообщение об...

Регулярные выражения: вставка символов в середину найденного выражения
Есть строки типа этого: &quot;В году 1783 марта месяца произошло событие, которые на долго...

Аналог C++Builder в Убунту
Мне нужна визуальная среда разработки под Убунту, типа лазарус, но только под Си плюс плюс.

Аналог кода на C++ Builder
Здравствуйте, помогите со следующей задачей. Нужно переписать программу с Delphi на C++ Builder,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.