Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 2 [Все]   Вниз
  Печать  
Автор Тема: Регулярные выражения и boost  (Прочитано 33014 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« : 14-01-2010 06:54 » 

Сабж. Как можно сделать?
По заданию, нужно использовать регулярные выражения. Нашел хороший код на http://msdn.microsoft.com/ru-ru/library/a9z6549f.aspx. Но там используется String^. А у меня все строки, грубо говоря, в char*. Код
Код:
char * cstr = 0; // Ноль для наглядности
...
String^ str;
str = cstr;
не пляшет. На http://msdn.microsoft.com/en-us/library/system.string.aspx прочитал, что это (String) строка символов Юникода. wchar_t* тоже не подходит.
Помогите, пожалуйста.
« Последнее редактирование: 14-01-2010 12:17 от Inkognito » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 14-01-2010 06:56 » 

а что такое String^ ?
Записан

Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #2 : 14-01-2010 06:57 » 

Сплошь и рядом используеться в MVS2008.
Цитата
System::String
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 14-01-2010 06:59 » 

шарп что ли ? ) Разделом ошибся ?
Записан

Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #4 : 14-01-2010 06:59 » 

Цитата
Язык: C++
Microsoft Visual Studio 2008
Version 9.0.30729.1 SP
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 14-01-2010 07:01 » 

нет в C++ оператора ^ , применимого к типу данных Улыбаюсь
Записан

Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #6 : 14-01-2010 07:06 » 

Visual C++ Express Edition.
Создал CLR -> CLR Console Application.
Автоматически вставило код:
Код:
int main(array<System::String ^> ^args)
{
...
}
Так это что, C#? Если да, то я не знал и потому тему в С++ кинул.

В любом случае, я не могу конвертировать char* в String^.
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #7 : 14-01-2010 07:11 » 

Inkognito, да с++ НО C++.NET
странная вещь
« Последнее редактирование: 14-01-2010 12:40 от Sel » Записан

Странно всё это....
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 14-01-2010 08:50 » 

Inkognito, а компилятор что пише то ?
Записан

Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 14-01-2010 09:13 » 

Правильно, класс String работает с юникодными символами (о чём можно было прочитать в MSDN, кстати Ага ). Соответственно, в лучшем случае, его можно проинициализировать из wchar_t*:
Код:
wchar_t * src = L"blahblahblah";
String^ str = gcnew String(src);
или как-то так.

Но в целом, я бы не советовал использовать .NET в с++ только ради регэкспа. Уж лучше тогда boost подключить и использовать regex оттуда.
Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #10 : 14-01-2010 12:02 » 

Я, кстати, находил упоминание о boost. Заходил на сайт http://www.boost.org/, у вкладку Download. А там архивы от 10 до 30 и более Мб. Я подумал, что что-то не то нашел. Улыбаюсь Сейчас качаю 1.32.0.
... Попробую.
... А сколько времени потрачено зря, ужос. Улыбаюсь
Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #11 : 14-01-2010 12:15 » 

Пишу
Код:
#include <boost/regex.h>
Получаю
Цитата
LINK : fatal error LNK1104: cannot open file "libboost_regex-vc6-sgd-1_32.lib"

libboost_regex-vc6-sgd-1_32.lib в папке boost нет. Поискал о libboost_regex-vc6-sgd-1_32.lib на google
http://www.google.ru/search?hl=ru&source=hp&q=libboost_regex-vc6-sgd-1_32.lib&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA+%D0%B2+Google&lr=&aq=f&oq=, но, к сожалению, не смог понять.

Как примерно работать с регулярными выражениями, нашел на http://blog.alno.name/2008/10/using-boost-regex/
Там следующий код:
Цитата
#include &lt;boost/regex.hpp&gt;
Но как его понимать? Ошибка получается:
Цитата
error C2006: #include expected a filename, found '&'
Записан
darkelf
Молодой специалист

no
Offline Offline

« Ответ #12 : 14-01-2010 12:26 » 

понимать, как:
Код:
#include <boost/regex.hpp>
как я понял из http://blog.alno.name/2008/12/using-boost-xpressive/ libboost_regex это дополнительная библиотека, возможно Вы либо не собрали её, когда собирали boost, либо, если Вы взяли уже кем-то собранный, то соответственно они её не собрали. Попробуйте Boost::Xpressive как я понимаю, она не требует дополнительных библиотек.
« Последнее редактирование: 14-01-2010 12:32 от darkelf » Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #13 : 14-01-2010 12:30 » 

Ошибка всё-равно осталась
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #14 : 14-01-2010 12:31 » 

Inkognito,

Цитата
Поискал о libboost_regex-vc6-sgd-1_32.lib на google
на винте поищи ) А потом пропиши путь для линкера
Записан

Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 14-01-2010 12:31 » 

Цитата
&lt;
это всего лишь знаки "больше"-"меньше" ("<>") криво сверстались.

ЗЫ. Надо в пути для инклудов проекта добавить путь к бусту.
Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #16 : 14-01-2010 12:33 » 

на винте поищи ) А потом пропиши путь для линкера
Искал - нет там такого. И где скачивал - тоже нет.

Дополнение: в папке Boost 1.32.0 (которую я скачал) lib-файлов нет вообще.
« Последнее редактирование: 14-01-2010 12:36 от Inkognito » Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 14-01-2010 12:37 » 

lib-ы там и не должно быть - её надо построить, или качать специальный инсталлер уже с бинарниками, а не основной архив буста. Это же всё в Getting Started написано должно быть.

PS. Кстати, а чего версия-то такая старая? Уже релиз 1.41 лежит
Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #18 : 14-01-2010 12:39 » 

Getting Started
Первый раз вижу.
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #19 : 14-01-2010 12:41 » 

http://www.boost.org/ -> на главной есть блок, и справа есть меню, "Getting Started": http://www.boost.org/doc/libs/1_41_0/more/getting_started/index.html
и там внизу - "Getting Started on Windows": http://www.boost.org/doc/libs/1_41_0/more/getting_started/windows.html (1 параграф, Get Boost)
« Последнее редактирование: 14-01-2010 12:43 от Вад » Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #20 : 14-01-2010 12:47 » 

Кстати, а чего версия-то такая старая? Уже релиз 1.41 лежит
Мне не нужен новый релиз, мне нужно хоть как-то с регекспами работать
Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #21 : 18-01-2010 05:55 » 

Надо в пути для инклудов проекта добавить путь к бусту.

Скачал инсталятор на boost 1.40.0. Записал его в C:\Program Files\boost\. Прописал полный путь: #include <C:/Program Files/boost/boost_1_40/boost/regex.h>. Но либ всё-равно не находит. В папке C:\Program Files\boost\ никаких дополнительных ехе-файлов/инсталяторов нету, собственно как и либ-файлов. Надо как-то установить буст через вижуал студио? Или как получить этот либ? Как вы проделывали эту установку?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #22 : 18-01-2010 06:48 » 

Пропиши в проекте путь "C:\Program Files\" и используй как <boost/regex.h>

Кстати, знаешь разницу между <> и "" в #include? Зачем полный путь пишешь в <>?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #23 : 18-01-2010 07:08 » 

Кстати, знаешь разницу между <> и "" в #include? Зачем полный путь пишешь в <>?
"" - это когда файл искать в папке проекта, а <> - в папке Include.

А можно немного точнее... Прописать в Project->Settings->Resources?
« Последнее редактирование: 18-01-2010 07:10 от Inkognito » Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #24 : 19-01-2010 13:47 » 

Такое впечатление, вроде я попросил программу за меня на халяву написать, или никто boost'ом не польззовался. Но ладно, программу написал без использования boost и, собственно, регулярных выражений. А с такой помощью легче написать свой regex.h. Тем более, в boost, чтоб использовать, всего-лишь, регулярные выражения, нужно штук 100 h-файлов - зачем делять такую сложную структуру, пока не разобрался, но первые впечатления не очень. Улыбаюсь

P.S. В дальнейших ответах не нуждаюсь.
P.S.S. В будущем обязательно напишу решение этой проблеммы.
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #25 : 19-01-2010 14:34 » 

Просто проблема непонятна. Есть же инструкция, как всё это собрать и подключить. Ты по ней делал? На каком пункте проблема?
« Последнее редактирование: 19-01-2010 14:36 от Вад » Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #26 : 19-01-2010 20:09 » 

Забей...
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #27 : 19-01-2010 20:15 » 

Inkognito, зря ты так
и теперь не понятно, У тебя получилось или нет.
Может оно тебе оказалось не нужным.
Может ты посчитал это сложным.
Может...
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #28 : 19-01-2010 20:40 » 

Inkognito, зря ты так
Всё-равно у каждого свое мнение; каждый будет считать, что прав, и всё останется, как прежде. Но может это и к лучшему? Но это уже вода.

и теперь не понятно, У тебя получилось или нет.
Как я уже сказал, я бросил установку boost и реализовал программу без него.

Может оно тебе оказалось не нужным.
Нужным... Было... Задача упростилась бы раза в 1,5-2.

Может...
Всё возможно...

Может ты посчитал это сложным.
Программа, вообще, сложная, но реализуемая.

P.S. Вад, обидеть не хотел, если так получилось.
« Последнее редактирование: 19-01-2010 20:46 от Inkognito » Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #29 : 19-01-2010 21:01 » 

Inkognito, всё равно не понимаю. По той ссылке, которую я тебе дал, есть вся информация.
Там описано, как сбилдить библиотеки буста. На системе с установленной VS это всего-то, запустить 1 bat-файл, а потом запустить то, что сбилдит этот файл. И подождать, пока закончит (процесс, к слову, небыстрый)
Там описан пример приложения, которое юзает буст. Включая настройки проекта, и где эти настройки в VS находятся. Там даже есть пример с использованием regex и детальное описание, как и что линковать.

"Если ничто другое не помогает - прочтите, наконец, инструкцию" (народная мудрость) Ничего личного.
« Последнее редактирование: 19-01-2010 21:07 от Вад » Записан
WDMclient
Гость
« Ответ #30 : 03-03-2010 14:13 » 

Такое впечатление, вроде я попросил программу за меня на халяву написать, или никто boost'ом не польззовался. Но ладно, программу написал без использования boost и, собственно, регулярных выражений. А с такой помощью легче написать свой regex.h. Тем более, в boost, чтоб использовать, всего-лишь, регулярные выражения, нужно штук 100 h-файлов - зачем делять такую сложную структуру, пока не разобрался, но первые впечатления не очень. Улыбаюсь

P.S. В дальнейших ответах не нуждаюсь.
P.S.S. В будущем обязательно напишу решение этой проблеммы.

Регулярные выражения в boost   делают это как это делает чемпион по обработке
текста  язык Perl.  Там даже опция есть такая  "format_perl" (она же и по умолчанию)

Так что если работал в Perl с регулярами то boost на 98% тоже самое.
Конечно если ты не знаком с Perl то придется долго шелушить мануалы и тыкать пальцем.


в общем произвело  на меня сильна благоприятное впечатление , и возвращаться ко
всяким string  отпало , плюс использование BOOST сильно повышает читабельность кода.

А да ,  при компайле либов  попотел немного , пока не нашел варинта компиляции такой

bjam  variant=release threading=multi link=static runtime-link=static

В разделе libc есть каталоги build (для каждой либы) туда нужно скопировать bjam.exe
и выполнить выше означеный строк.
Все либы не надо билдить , а только те которые потребует компилятор по ходу.


Видно Inkognito ты не разобрался раз не смог отписать вовремя.


Ты пишешь что "В дальнейших ответах не нуждаюсь" -
                 это потому что ты  неопытный б...
« Последнее редактирование: 03-03-2010 14:23 от WDMclient » Записан
yudjin
Помогающий

ua
Offline Offline
Пол: Мужской

« Ответ #31 : 14-07-2010 13:18 » 

Добрый день. Пытаюсь осваивать регулярные выражения. Написал такое выражение, находящее домен в строке:
Код:
boost::regex FindIP_exp(".*http://(\\w+[^/]*)");
Например, если будет строка " ывфыва http://images.amazon.com/imagesыва " - выводит images.amazon.com
Но вот беда, если в строке будет два значения, удовлетворяющих шаблону, то берется последнее. Как указать, что выражение может встречаться неограниченное число раз, и каждое надо запомнить?

И еще - правильно ли я понимаю написанный код:

.* -           любые символы, предшевствующие http://
http://
(              - сохраняет
\\w+        - последовательность любых символов,
[^/]         - пока не встретится /
*             -  ЛЮБЫХ


Вот... туговато пока с регэкспами
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #32 : 14-07-2010 15:14 » 

И еще - правильно ли я понимаю написанный код:

.* -           любые символы, предшевствующие http://
http://
(              - сохраняет
\\w+        - последовательность любых символов,
[^/]         - пока не встретится /
*             -  ЛЮБЫХ
)  

Вот... туговато пока с регэкспами

(              - группировка.
\\w+        - символы класса [A-Za-z0-9_] в количестве 1+.
[^/]*       - символы класса "все символы, исключая слеш", в количестве 0+.
)

Группировка зачастую используется для "захвата" последовательности символов, соотвествующих шаблону внутри группы.

Шаблон некорректный, т.к. в именах доменов встречается минус, но не встречается подчеркивание.
Я бы сделал такой: "http://([-a-zA-Z0-9]+(?:\\.[-a-zA-Z0-9]+)+)/".
Как управлять захватом - читай описание API.
« Последнее редактирование: 15-07-2010 05:28 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: 1 2 [Все]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines