7. Класс sregex_token_iterator
istream_iterator
. Мы передадим ему целую строку, представляющую собой итерабельный диапазон данных, и определенное нами регулярное выражение. Третий параметр {1,2}
— это список инициализаторов целочисленных значений. Он определяет, что мы хотим итерировать по группам 1
и 2
из полученных им выражений: sregex_token_iterator it {
begin(in), end(in), link_re, {1, 2}};
8. Теперь у нас есть итератор, который будет возвращать все найденные ссылки и их описания. Мы предоставим его и итератор того же типа, созданный по умолчанию, функции print
print(it, {});
}
9. Компиляция и запуск программы дадут следующий результат. Я запустил программу curl
cat some_html_file.html | ./link_extraction
. Использованное нами регулярное выражение довольно жестко определяет представление о том, как должны выглядеть ссылки в документе HTML. В качестве самостоятельной работы можете сделать его более обобщенным.$ curl -s "https://isocpp.org/blog" | ./link_extraction
Sign In / Suggest an Article : https://isocpp.org/member/login
Register : https://isocpp.org/member/register
Get Started! : https://isocpp.org/get-started
Tour : https://isocpp.org/tour
C++ Super-FAQ : https://isocpp.org/faq
Blog : https://isocpp.org/blog
Forums : https://isocpp.org/forums
Standardization : https://isocpp.org/std
About : https://isocpp.org/about
Current ISO C++ status : https://isocpp.org/std/status
(...и многие другие...)
Как это работает
Регулярные выражения (или коротко
В данном примере мы сначала создали объект типа регулярных выражений. Мы передали его конструктору строку, которая описывает регулярное выражение. Самое простое регулярное выражение выглядит как "."
"a"
соответствует только символам 'a'
. Выражение "ab*"
означает «один символ а
, а затем ноль или больше символов b
» и т.д. Регулярные выражения — довольно обширная тема, более подробную информацию можно найти в «Википедии» и на других сайтах и в литературе.Еще раз взглянем на регулярное выражение, соответствующее нашему представлению о ссылках HTML. Простая ссылка HTML может выглядеть как A great link
some_url.com/foo
, а также A great link
. Мы создали следующее регулярное выражение, которое содержит Полное совпадение всегда является
. Заключенная в кавычки часть href
, которая содержит URL, — это
и
, содержащий описание ссылки.Существует множество функций STL, которые принимают объекты регулярных выражений. Однако мы непосредственно использовали адаптер для итератора, работающего с токенами регулярного выражения. Он представляет собой высокоуровневую абстракцию, применяющую std::regex_search, чтобы автоматизировать работу по поиску совпадений. Мы создали его экземпляр следующим образом:
sregex_token_iterator it {begin(in), end(in), link_re, {1, 2}};