Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
DarkMasterW
4 / 4 / 0
Регистрация: 25.10.2013
Сообщений: 230
#1

Boost::regex не могу сформировать ссылку на паттерн при поиске - C++

26.07.2014, 21:28. Просмотров 404. Ответов 6
Метки нет (Все метки)

Необходимо найти 2 повторяющихся заголовка и объединить некоторое содержимое через replace.
Хотел создать выражение для поиска:
Код
^(prefix=)(.*)(\n)([.|\n]*)($2)
Вот только ссылка $2 не возвращает содержимое (.*). Можно как-то сделать подобную ссылку?

Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.07.2014, 21:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Boost::regex не могу сформировать ссылку на паттерн при поиске (C++):

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

Регулярное выражение boost::regex - C++
Здравствуйте форумчане. Не получается написать регулярное выражения для разбора такой строки: g=p1#s=p1,p2#t=p1 g, s, t - имена...

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

Вылетает boost::regex в windows forms, в консоли всё нормально - C++
работаю с формой, подключаю <boost/regex.hpp>. Компиляция проходит без ошибок, но когда нажимаю f5 вылетает ошибка: "Debug assertion...

Ошибка при использовании boost::regex - Boost C++
На строке: boost::regex xRegEx("(\\w+)-(\\d+)-(\\w+)-(\\d+)"); Возникают ошибки: sp_convertible.hpp(48): E2514 Cannot (yet) use...

Regex паттерн - C#
Помогите пожалуйста с паттерном, не могу правильный составить... Имеем вот такой вот html код: <tr...

6
igorrr37
1719 / 1347 / 168
Регистрация: 21.12.2010
Сообщений: 2,070
Записей в блоге: 10
26.07.2014, 23:30 #2
Регулярка, скорее всего, неправильная. Вот это (.*) просто захватит весь текст и делу конец. Какое задание ставилось изначально?
0
DarkMasterW
4 / 4 / 0
Регистрация: 25.10.2013
Сообщений: 230
28.07.2014, 10:45  [ТС] #3
Цитата Сообщение от igorrr37 Посмотреть сообщение
Вот это (.*) просто захватит весь текст и делу конец
Захватит до переноса строки. Используется флаг исключающий из точки символ перевода строки. Кстати даже без флага захватит только максимальное количество текста при котором остальное выражение принимает истину, но при этом может быть захвачено несколько таких же "хвостов" внутрь (.*).
Цитата Сообщение от igorrr37 Посмотреть сообщение
Какое задание ставилось изначально?
Есть текстовый файл(просто удивительно учитывая регуляки ), в файле находятся блоки с ид. Большинство блоков имеет дополнительный блок в произвольном месте с аналогичным ид, доп. блок всегда ниже основного блока, так же у него чуть иной префикс перед ид. Задача перетряхнуть второй блок в новый формат и засунуть его внутрь основного блока с тем же ид.

Добавлено через 18 часов 9 минут
Идеи?

Добавлено через 16 часов 50 минут
Актуально.
0
DiffEreD
1435 / 772 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
28.07.2014, 12:06 #4
Ну вроде как $n это заменители, а не ссылки. Выражение должно быть примерно таким:
C++
1
(prefix=)(.*?)(\n)(\2)
А лучше киньте пару строк текста того что надо сделать с пояснениями.
0
DarkMasterW
4 / 4 / 0
Регистрация: 25.10.2013
Сообщений: 230
28.07.2014, 16:09  [ТС] #5
Код
[globalID=id1]
#block1
param1=qwe
#end

#block2
#end

[globalID=id2]
#block1
param1=qwe
#end

#block2
#end

[localID=id1] // Содержимое этой группы должно переехать внутрь [globalID=id1] #block2
param2=var2
param3=var3
param4=var4

[globalID=id3]
....
Я почему-то думал буст не \2, а $2 предпочитает... Считал, что связано с экранированием символов в плюсах...

Добавлено через 11 минут
The Perl and Boost.Regex equivalents are as follows:

Perl Boost.Regex
$` m.prefix()
$& m[0]
$n m[n]
$' m.suffix()
0
DiffEreD
1435 / 772 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
28.07.2014, 17:25 #6
Как то так:
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
#include <iostream>
#include <fstream>
#include <string>
#include <boost/regex.hpp>
 
int main()
{
   std::ifstream ifs("file.txt");
   if (!ifs.is_open()) {
      std::cerr << "Error...\n";
      return 1;
   }
 
   std::string buffer{std::istreambuf_iterator<char>(ifs),
                     std::istreambuf_iterator<char>()};
   const boost::regex localId(R"((\[localID=id(\d+)\]((.|\n|\r)*?))(?=\[))");
   const boost::regex globalId(R"(\[globalID=id(\d+)\]((.|\n|\r)*?)(?=\[))");
   boost::smatch local_match;
   boost::smatch global_match;
 
 
   bool local_res = boost::regex_search(buffer, local_match, localId);
   bool global_res = boost::regex_search(buffer, global_match, globalId);
 
   if (global_res && local_res && local_match[2] == global_match[1])
   {
      std::string temp_global = global_match[0];
      std::string temp_local = "\n" + local_match[0];
      const boost::regex block2(R"((?<=#block2)((.|\n|\r)*?)(?=#end))");
      std::cout << boost::regex_replace(temp_global, block2, temp_local);
   }
 
   system("pause");
   return 0;
}
Это только для одного совпадения. Правильнее будет в цикле проходиться по всей строке данных.
Возможно есть и более изящное решение.
0
DarkMasterW
4 / 4 / 0
Регистрация: 25.10.2013
Сообщений: 230
28.07.2014, 19:11  [ТС] #7
Поступил примерно так же. Тупо выдрал все ид списком и составил правило под каждый ид. Задача вроде как решена, вот только вопрос мучает до сих пор. Неужели на паттерн никак не сослаться?
0
28.07.2014, 19:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.07.2014, 19:11
Привет! Вот еще темы с ответами:

.NET 4.x Regex не принимает паттерн - C#
не могу разобраться, как нужно правильно &quot;скармливать&quot; Regex символ бэкслэша &quot;\&quot;. в таком варианте: var outputFolder =...

RegEx Boost - Boost C++
Доброго времени суток. Ребята у меня во время выполнения программы, сама программа ругается на регулярное выражение. Может кто сталкивался,...

Проблема с boost-regex - Boost C++
Код программы: #include &lt;iostream&gt; #include &lt;boost/regex.hpp&gt; using namespace std; int main() { boost::regex...

Парсер boost/regex - C++ Builder
Всем привет вот возникла сложно с boost/regex начну по порядку. Написав достаточное количество парсеров информации из интернета я понял...


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

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

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