powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Опять регулярные выражения
4 сообщений из 4, страница 1 из 1
Опять регулярные выражения
    #39500585
polin11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть HTML разметка "<li 1>Новости</li><li 2>Вести</li><li 3>Двести</li>"
В результате нужно получить в результате вектор с контентом [Новости, Вести, Двести].
Есть код, который работает
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
#include<iostream>
#include <string>
#include "regex"
#include "iterator"
#include "map" 
using namespace std;
int main()
{
	string htmlTemp="<li 1>Новости</li><li 2>Вести</li><li 3>Двести</li>";
    
	smatch res;
	string link="li";
	vector<string> myList;
	regex reg("<" + link + "\\s.>([^</"+link+"]*)</" + link + ">");
	while (regex_search(htmlTemp, res, reg))
	{
		string stroka = res[1].str();
		htmlTemp = res.suffix().str();
		myList.push_back(stroka);
	}
	for(int i=0;i<myList.size();i++)
	 cout<<myList[i] <<endl;
    return 0;    
} 


Cледующий код некорректно работает, хотя по моему мнению должен, не понимаю почему???
В результате только последний элемент [Двести]
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
#include<iostream>
#include <string>
#include "regex"
#include "iterator"
#include "map" 
using namespace std;
int main()
{
	string htmlTemp="<li 1>Новости</li><li 2>Вести</li><li 3>Двести</li>";
    
	smatch res;
	string link="li";
	vector<string> myList;
	regex reg("<" + link + "\\s.*>([^</"+link+"]*)</" + link + ">");
	while (regex_search(htmlTemp, res, reg))
	{
		string stroka = res[1].str();
		htmlTemp = res.suffix().str();
		myList.push_back(stroka);
	}
	for(int i=0;i<myList.size();i++)
	 cout<<myList[i] <<endl;
    return 0;    
} 
...
Рейтинг: 0 / 0
Опять регулярные выражения
    #39500654
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polin11,

.* съедает максимум символов, поэтому первые две строки пропадают там.
Замените на .*?
Этот шаблон съедает минимум символов и остановится после первого слова.
Подробности гуглите по словам greedy non-greedy regex
...
Рейтинг: 0 / 0
Опять регулярные выражения
    #39500655
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и вот эта конструкция [^</"+link+"] которая разворачивается в [^</li] - бессмысленна.
Она работает только случайно потому что в вашем тексте внутри тегов нет символов /, l, i
В данном случае нужно писать [^<].
Ну и почитать про регексы штоле ))
...
Рейтинг: 0 / 0
Опять регулярные выражения
    #39500702
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polin11,

статья о регулярках в Википедии довольно хороша. В разделе Жадная и ленивая квантификация как раз на примере HTML показано её действие.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Опять регулярные выражения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]