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

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

18.04.2015, 10:55. Показов 1649. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru