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

Boost C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
BuGi
24 / 24 / 1
Регистрация: 02.01.2012
Сообщений: 371
#1

Составление регулярного выражения - Boost C++

26.03.2013, 14:55. Просмотров 1143. Ответов 9
Метки нет (Все метки)

Не нашел подходящего раздела, поэтому запиливаю сюда.

У меня есть веб страничка, где в тэгах заключены сайты, которые мне надо вынуть.
К примеру,
HTML5
1
href="http://www.112.ru/" onmousedown='rc
и там дальше пошло

Вот регекс мой юрл вынимает
C++
1
boost::regex reg("href=\"(\.+)\" onmousedown='rc");
Но если повторов больше 1
HTML5
1
href="http://www.112.ru/" onmousedown='rchref="http://www.112.ru/" onmousedown='rc
То выпиливает не линк, а http://www.112.ru/" onmousedown='rchref="http://www.112.ru/" onmousedown='rc

Не подскажите что не так?

Добавлено через 3 часа 16 минут
Нашел на php форуме
Потому что он нашел 1 одно вхождение шаблона в строке.
Если шаблон в строке не обнаружен, Preg_match вернет 0. При нахождении первого вхождения,
функция сразу возвращает результат!
Дальнейший поиск не продолжается (см. preg_amtch_all)
Возможно, что и тут так, но почему тогда возвращает не только url, а невесть что?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.03.2013, 14:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Составление регулярного выражения (Boost C++):

Составление регулярного выражения - Boost C++
Ещё не работал с regex в с++. Есть файл типа: <city id="94610" region="21770" head="0" type="4" country="Австралия" part="" resort="0"...

Как распарсить строку с помощью регулярного выражения - Boost C++
Как распарсить строку такого вида? "слово - любое_слово любое_слово - слово", где любых слов может быть сколько угодно и они разделены...

Составление регулярного выражения - Java
Здраствуйте! Помогите пожалуйста составить регулярное выражение для строки, например String str = "hello world heoo dasjh ho! ahelloa...

Составление регулярного выражения - C#
Здравствуйте! Имеется строка <tr><td>10 нор.  </td><td style="text-align:right">6,972,500</td></tr> Помогите...

Составление регулярного выражения - PHP
Привет. Есть теги {group=8}Какой то текст{/group} Они разумеется в tpl файле который достаётся функцией в php файле. Задача...

Составление регулярного выражения, выделить имя файла - C#
line = @"<a class="desktop" target="_blank" href="/b/src/99943716/14397195248010.webm">14397195248010.webm</a>"; Regex.Match(line,...

9
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,047
Записей в блоге: 17
26.03.2013, 17:04 #2
boost/regex Поиск ссылок в html-файле
1
BuGi
24 / 24 / 1
Регистрация: 02.01.2012
Сообщений: 371
26.03.2013, 19:46  [ТС] #3
Почему-то выводит только последний результат
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
#include <iostream>
#include <string>
#include<boost/regex.hpp>
using namespace std;
 
 
int main()
{
start:
    string str;
    getline(cin,str);
 
    //href="http://www.112.ru/" onmousedown='rc
    boost::regex reg("<a.*href=\"(.+)\".+onmousedown=\"rc.*>.+<\/a>");
    boost::smatch sm;
    
    if(boost::regex_search(str,sm,reg))
    {
        for(size_t i = 1;i<sm.size();i++)
        {
            cout << sm[i] << endl;
        }
    }
    else cout << "Something wrong :'(";
    cout << "end" << endl << endl;
    goto start;
}
И так тоже
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
#include <iostream>
#include <string>
#include<boost/regex.hpp>
using namespace std;
 
 
int main()
{
start:
    string str;
    getline(cin,str);
 
    //href="http://www.112.ru/" onmousedown='rc
    boost::regex reg("<a.*href=\"(.+)\".+onmousedown=\"rc.*>.+<\/a>");
    boost::smatch sm;
    std::string::const_iterator xItStart = str.begin();
    std::string::const_iterator xItEnd = str.end();
    
    while(boost::regex_search(xItStart, xItEnd,sm,reg))
    {
        for(size_t i = 1;i<sm.size();i++)
        {
            cout << sm[i] << endl;
        }
        xItStart = sm[1].second;
    }
    //else cout << "Something wrong :'(";
    cout << "end" << endl << endl;
    goto start;
}
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,047
Записей в блоге: 17
26.03.2013, 19:53 #4
Может не "жадно" : (.+?)
1
BuGi
24 / 24 / 1
Регистрация: 02.01.2012
Сообщений: 371
26.03.2013, 19:55  [ТС] #5
И так выводит только последний
0
diagon
Higher
1930 / 1196 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
26.03.2013, 20:39 #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
#include <iostream>
#include <string>
#include <boost/xpressive/xpressive.hpp>
 
int main()
{
   using namespace boost::xpressive;
   
   std::string str;
   
   for (std::string tmp; std::getline(std::cin, tmp); str += tmp + "\n");
   
   sregex reg = "<a" >> (s1 = -+_) >> '>';
   
   for(sregex_iterator cur( str.begin(), str.end(), reg ); cur != sregex_iterator(); ++cur)
   {  
     std::string s = (*cur)[1];
 
     sregex href = "href=" >> (s1 = (as_xpr('\"') | '\'') ) >> (s2 = -+_) >> s1;
     
     for (sregex_iterator it( s.begin(), s.end(), href ); it != sregex_iterator(); ++it)
     {
        std::cout << (*it)[2] << std::endl;
     } 
   }
}
http://liveworkspace.org/code/MC2Qr
4
BuGi
24 / 24 / 1
Регистрация: 02.01.2012
Сообщений: 371
26.03.2013, 21:14  [ТС] #7
Это конечно круто, но нельзя изменить мой код?) Тут со многим придется разбираться, а закончить программу надо сегодня
0
diagon
Higher
1930 / 1196 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
26.03.2013, 21:24 #8
Цитата Сообщение от BuGi Посмотреть сообщение
Это конечно круто, но нельзя изменить мой код?)
В ваш код мне вникать лень, но я вижу, что вы пытаетесь это сделать одной регуляркой. Я воспользовался двумя - сначала ищу все теги <a>, а затем делаю еще один поиск по их содержимому. Это несколько проще и эффективнее.

Оно же на строковых регехах:
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
#include <iostream>
#include <string>
#include <boost/regex.hpp>
 
int main()
{
   using namespace boost;
   
   std::string str;
   
   for (std::string tmp; std::getline(std::cin, tmp); str += tmp + "\n");
   
   regex reg( "<a(.+?)>" );
   
   for(sregex_iterator cur( str.begin(), str.end(), reg ); cur != sregex_iterator(); ++cur)
   {  
     std::string s = (*cur)[1];
     
     regex href ( "href=([\'\"])(.+?)\\1");
     
     for (sregex_iterator it( s.begin(), s.end(), href ); it != sregex_iterator(); ++it)
     {
        std::cout << (*it)[2] << std::endl;
     } 
   }
}
http://liveworkspace.org/code/15lCSL

Но прошлый вариант таки побыстрее работает :)
1
BuGi
24 / 24 / 1
Регистрация: 02.01.2012
Сообщений: 371
26.03.2013, 22:21  [ТС] #9
Спасибо, буду разбираться. Но все-таки хотелось бы узнать, почему не работал тот пример) Чтобы в будущем не стать на эти грабли
0
igorrr37
1648 / 1276 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 7
08.04.2013, 11:35 #10
пример не работал потому что регулярка должна быть не жадной и проходить надо в цикле
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <string>
#include <fstream>
#include <iterator>
#include <boost/regex.hpp>
 
int main ()
{
    std::ifstream ifs("in.txt");
    if(ifs.is_open())
    {
        std::string s((std::istreambuf_iterator<char>(ifs.rdbuf())), std::istreambuf_iterator<char>());
        boost::regex reg("href=\"(.+?)\"");
        for(boost::sregex_iterator ib(s.begin(), s.end(), reg), ie; ib != ie; ++ib)
        {
            std::cout << ib->operator[](1) << '\n';
        }
    }
    else
        std::cerr << "Unable to open file\n";
    ifs.close();
    return 0;
}
0
08.04.2013, 11:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.04.2013, 11:35
Привет! Вот еще темы с ответами:

Составление регулярного выражения для получения текста между заданными символами - Visual Basic .NET
Привет! Ребят, кто разбирается в этой магии? :D Подскажите, как будет выглядеть регулярка, чтобы выдернуть любой текст между и &quot;, В...

Оптимизация регулярного выражения - Perl
Доброго времени суток, дамы и господа. имеется файл: парсинг этого файла занимает: при этом top показывает загрузку...

Жадность регулярного выражения - PHP
Привет. Вот пишу лабу, и никак не пойму, в чем проблема. Код: $pattern = &quot;/&gt;.*?&quot; . $words . &quot;.*?&lt;/&quot;; preg_match_all($pattern,...

AS 3.0 Расшифровка регулярного выражения - ActionScript
vars = String(GameTime.serverTime); str = JSON.serialize(data); str = str.replace(/\\\\/g, &quot;||&quot;); vars = str; Замена чего и на что...


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

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

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