@Junior007

Профессионально ли реализовал алгоритм?

Всем привет!

Разбираюсь с парсингом текста, поставил себе задачу извлечь все ссылки из строки (адреса ссылок).
Реализовал таким образом:

std::string str = "<html><body><a href=\"url1\">name link1</a><div><a href=\"url2\">name link2</a></body></html>";
	std::regex reg("(<a href=\")([\\w\\s]*)(\">)(.*)(</a>)");
	std::smatch res;
	std::vector<std::string> arr;

	std::string tmp_str = str;
	while (std::regex_search(tmp_str, res, reg))
	{
		arr.push_back(res[2]);
		tmp_str = tmp_str.substr(res.position(2));
	}


Интересует "профессиональность" подхода, если можно так выразится. Разумеется потом все оберну в класс и сделаю красиво, сейчас интересует именно сам алгоритм, может быть можно сделать быстрее/лучше?
  • Вопрос задан
  • 248 просмотров
Решения вопроса 1
customtema
@customtema
arint.ru
Более универсальный чек-лист:
  • Работает
  • Не падает, не ломается
  • Не тормозит, безопасен
  • Легко сопровождается, дорабатывается


За сим все. Остальное - следствия.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
Rou1997
@Rou1997
Явно непрофессионально, поскольку у вас не было реальной задачи, за которую вам заплатят деньги. Нет, я ничего не путаю, у слова профессионал два значения, но они тесно связаны.
А если она у вас есть, но вы не можете проверить решение на соответствие ей, а вместо этого спрашиваете совет на Тостере, то это непрофессионализм.

По теме:
1) использовать готовые библиотеки, вместо регулярных выражений, которые негибки, являются "велосипедом" (можно очень многое не учесть) и трудны к восприятию
2) скорее всего, не использовать C++, на нем не быстро

Но это для большинства задач, а не для всех.
Ответ написан
Комментировать
sim3x
@sim3x
Про используют чужой код, а не изобретают велосипед
https://github.com/google/gumbo-parser
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Нет. Контрольные примеры:
<a href="#hello">hello</a>
<a href="site.ru?12">hello</a>
<a href="hello-1">hello</a><a href="hello-2">hello</a>
<a href="hello">hello<a href="hello-2">hello</a>

Ну и скобок накручено почём зря.
P.S. Ещё парочка примеров:
<a title="привет" href="#hello">hello</a>
<a      href="test">test</a>
Ответ написан
@abcd0x00
Программа (код) должна быть правильной, понятной и легко изменяемой.

Правильность там страдает, потому что берёт не все ссылки, которые надо брать, и берёт то, что вообще не ссылка, как ссылку. (Если туда вставить комментарий html со ссылкой внутри, она спокойно определит эту ссылку как валидную. И такое часто бывает в реальных страницах - код комментируют периодически и всё это продолжает передаваться.)

Понятность страдает в дурацких, ничего о себе не говорящих именах переменных и запутанном регулярном выражении. Если ты берёшь ссылку, то в регулярном выражении только у неё скобки группы и должны быть, а не у всего подряд. (Из-за того что это регулярное выражение запутано, в него легко может закрасться ошибка, и ты её просто не заметишь, так как это регулярное выражение муторно читается каждый раз и ты просто не будешь этого делать.)

Лёгкая изменяемость здесь особо не нарушена, но только потому, что код небольшой. Был бы он больше, это тоже дало бы о себе знать.

В общем, добавление везде std:: не делает код профессиональным, так как это просто ламерский код с добавленными везде std:: .
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы