Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
 Аватар для QVO
652 / 462 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4

Регулярное выражение boost::regex

18.04.2015, 10:55. Показов 1673. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте форумчане.
Не получается написать регулярное выражения для разбора такой строки:
JavaScript
1
g=p1#s=p1,p2#t=p1
g, s, t - имена параметров, которые нужно вытащить.
p1, p2 - любой буквенно-цифровой текст.

Мне необходимо заполнить std::multimap именами параметров и их значениями.

Добавлено через 11 минут
Забыл добавить, количество значений p1, p2 ... pn у параметров не ограничено.

Добавлено через 6 минут
Ссылка на код: https://ideone.com/QfzmOT
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.04.2015, 10:55
Ответы с готовыми решениями:

Возможно ли найти расположение подстроки в строке через регулярное выражение std::regex?
Слышал, что C# позволяет с помощью regex определять начало найденной подстроки и её длину. Возможно ли это сделать на C++? Например,...

std::regex и boost::regex
Что-то я не пойму что реализация их различна ? #include <iostream> #include <string> //#include <regex> //using...

Boost regex поиск в массиве
Ффф, мне надо на boost regex искать все совпадения в массиве и выдавать в масиив. Прототип функции не придумал. Пока что. Но, думаю идеи...

13
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
18.04.2015, 11:01
C++
1
"([a-z]+)=[\\w,]+#([a-z]+)=[\\w,]+#([a-z]+)=[\\w,]+"
1
 Аватар для QVO
652 / 462 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
18.04.2015, 11:22  [ТС]
nmcf, а если там будет больше трех параметров? Допустим:
g=p1,p2#s=p1,p2#t=p1,p2,p3#k=p1
Смысл примерно такой:
1. Найти все параметры со значениями в строке:

C++
1
2
3
4
5
6
7
8
if( boost::regex_match(parameters, results, regex) )
        for(const auto& x : results)
            std::cout << x;
// out
g=p1,p2
s=p1,p2
t=p1,p2,p3
k=p1
2. Разобрать найденные подстроки на параметр и его значения и занести в std:map:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
multimap<std::string, std::string> m;
//.. 
if( boost::regex_...(x, results2, regex2) )
//..
for(const auto& i : results2)
//..
m.insert(pair<string, std::string>("g", p1));
m.insert(pair<string, std::string>("g", p2));
 
m.insert(pair<string, std::string>("s", p1));
m.insert(pair<string, std::string>("s", p2));
 
m.insert(pair<string, std::string>("t", p1));
m.insert(pair<string, std::string>("t", p2));
m.insert(pair<string, std::string>("t", p3));
 
m.insert(pair<string, std::string>("k", p1));
}
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
18.04.2015, 11:25
QVO, выдирайте подстроку,а её в цикле бейте по запятым.
0
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
18.04.2015, 11:31
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <string>
#include <vector>
#include <boost/algorithm/string/regex.hpp>
 
int main() {
    const std::string parameters = "g=p1#s=p1,p2#t=p1";
    std::vector<std::string> matches;
    boost::find_all_regex(matches, parameters, boost::regex("\\w+\\s*=\\w+\\s*(,\\w+\\s*)*(?=#)*"));
    for (auto& str : matches)
        std::cout << str << "\n";
}
Добавлено через 1 минуту
А вообще то для такой задачи надо использовать boost.spirit
2
 Аватар для QVO
652 / 462 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
18.04.2015, 11:59  [ТС]
DiffEreD, подскажите, пожалуйста, русскоязычную литературу по этой библиотеке.
0
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
18.04.2015, 12:08
http://kiri11.ru/tag/boost/
1
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
18.04.2015, 13:30
Лучший ответ Сообщение было отмечено QVO как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    std::multimap<std::string, std::string> m;
    std::string s = "g=p1#s=p1,p2#t=p1#z=p3,p4,p10";
 
    std::regex r("#*([a-z]+)=([\\w,]+)");
    std::regex r1(",*(\\w+)");
 
    for (auto it = std::regex_iterator<std::string::iterator>(s.begin(), s.end(), r); it != std::regex_iterator<std::string::iterator>(); ++it)
    {
        std::string p = (*it)[2];
 
        for (auto it1 = std::regex_iterator<std::string::iterator>(p.begin(), p.end(), r1); it1 != std::regex_iterator<std::string::iterator>(); ++it1)
        {
            std::cout << (*it)[1] << " " << (*it1)[1] << std::endl;
            m.insert(std::make_pair((*it)[1], (*it1)[1]));
        }
    }
1
 Аватар для QVO
652 / 462 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
18.04.2015, 13:56  [ТС]
DiffEreD, для моего случая использовать boost spirit kwd?
0
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
18.04.2015, 14:09
QVO, я не эксперт в этой библиотеке, только поверхностно с ней работал. Если будет время, попробую потом написать грамматику для данного случая.

Добавлено через 1 минуту
В разделе Boost есть пару примеров по spirit.
0
 Аватар для QVO
652 / 462 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
18.04.2015, 22:29  [ТС]
DiffEreD, написал код, но он не компилируется... может будут какие-то приложения? Ошибка: static assertion failed: error_invalid_expression BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Expr)
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
18.04.2015, 22:38
Чем мой вариант не устроил?
0
 Аватар для QVO
652 / 462 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
19.04.2015, 00:09  [ТС]
nmcf, Ваш вариант то, что я хотел. Просто расширяю кругозор. Мне парсинг в будущем пригодится.
0
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
19.04.2015, 00:25
По spirit могу предложить такой вариант:
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <utility>
#include <boost/phoenix/phoenix.hpp>
#include <boost/spirit/include/qi.hpp>
 
namespace qi = boost::spirit::qi;
namespace phx = boost::phoenix;
namespace ascii = boost::spirit::ascii;
 
using map_t = std::multimap<std::string, std::string>;
using pair_t = std::pair<std::string, std::string>;
 
// g=p1#s=p1,p2#t=p1#z=p3,p4,p10
 
template <typename Iterator>
struct my_grammar : qi::grammar<Iterator, ascii::space_type>
{
   my_grammar(map_t& map) : my_grammar::base_type(pairs)
   {
      using qi::_1;
      using qi::_a;
      using qi::char_;
      using qi::alnum;
      using qi::alpha;
      using phx::construct;
      using phx::insert;
 
      pairs = pair % '#';
      pair  = string_[_a = _1] >> '=' >> string_[insert(phx::ref(map), construct<pair_t>(_a, _1))] % ',';
      string_ = (alpha | char_('_')) >> *(alnum | char_('_'));
   }
 
   qi::rule<Iterator, ascii::space_type> pairs;
   qi::rule<Iterator, qi::locals<std::string>, ascii::space_type> pair;
   qi::rule<Iterator, std::string()> string_;
};
 
int main()
{
   std::string expr;
   map_t map;
 
   using ascii::space;
   while (true)
   {
      std::cout << "Enter expr: ";
      std::getline(std::cin, expr);
      std::string::iterator  begin = expr.begin(), end   = expr.end();
      my_grammar<std::string::iterator> gr(map);
      qi::phrase_parse(begin, end, gr, space);
 
      for (const auto& p : map)
         std::cout << p.first << " " << p.second << "\n";
   }
}
вывод
Enter expr: g=p1#s=p1,p2#t=p1#z=p3,p4,p10
g p1
s p1
s p2
t p1
z p3
z p4
z p10
Enter expr:
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.04.2015, 00:25
Помогаю со студенческими работами здесь

Boost Regex, работа с указателями
Доброго, пытаюсь разобраться с boost::regex и для удобства решил написать обертку под boost::regex_search(...) Но возникли некие вопросы,...

Парсер лога с использованием boost::regex
Всем привет. Есть задача пропарсить лог антивирусника с ипользованием boot:: regex, и выдать формат Filename - Diagnosis. Лог не очень...

Вылетает boost::regex в windows forms, в консоли всё нормально
работаю с формой, подключаю &lt;boost/regex.hpp&gt;. Компиляция проходит без ошибок, но когда нажимаю f5 вылетает ошибка: &quot;Debug assertion...

Boost::regex не могу сформировать ссылку на паттерн при поиске
Необходимо найти 2 повторяющихся заголовка и объединить некоторое содержимое через replace. Хотел создать выражение для поиска: ...

Регулярное выражение
Пишу под Qt и получил такую проблему. Почему данный код не выводит чего либо в консоль?: QString data(&quot;&lt;div...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru