Что такое парсинг строки

Парсинг. Что это и где используется

Парсинг (Parsing) – это принятое в информатике определение синтаксического анализа. Для этого создается математическая модель сравнения лексем с формальной грамматикой, описанная одним из языков программирования. Например, PHP, Perl, Ruby, Python.

Когда человек читает, то, с точки зрения науки филологии, он совершает синтаксический анализ, сравнивая увиденные на бумаге слова (лексемы) с теми, что есть в его словарном запасе (формальной грамматикой).

Программа (скрипт), дающая возможность компьютеру «читать» – сравнивать предложенные слова с имеющимися во Всемирной сети, называется парсером. Сфера применения таких программ очень широка, но все они работают практически по одному алгоритму.

Как работает парсинг, что это такое? Алгоритм работы парсера

Независимо от того на каком формальном языке программирования написан парсер, алгоритм его действия остается одинаковым:

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

Этим парсер коренным образом отличается от компьютерного вируса – автономной программы, способной к размножению, хотя по сути своей работы он похож на трояна. Ведь он получает данные, иногда конфиденциального характера, не спрашивая желания их владельца.

Зачем нужен парсинг?

Сбор информации в интернете – трудоемкая, рутинная, отнимающая много времени работа. Парсеры, способные в течение суток перебрать большую часть веб-ресурсов в поисках нужной информации, автоматизируют ее.

Наиболее активно «парсят» всемирную сеть роботы поисковых систем. Но информация собирается парсерами и в частных интересах. На ее основе, например, можно написать диссертацию. Парсинг используют программы автоматической проверки уникальности текстовой информации, быстро сравнивая содержимое сотен веб-страниц с предложенным текстом.

Без программ парсинга владельцам интернет-магазинов, которым требуются сотни однотипных описаний товаров, технических характеристик и другого контента, не являющегося интеллектуальной собственностью, было бы трудно вручную заполнять характеристики товаров.

Возможностью «спарсить» чужой контент для наполнения своего сайта пользуются многие веб-мастера и администраторы сайтов. Это оправдано, если требуется часто изменять контент для представления текущих новостей или другой, быстро меняющейся информации.

Парсинг – «палочка-выручалочка» для организаторов спам-рассылок по электронной почте или каналам мобильной связи. Для этого им надо запустить «бота» путешествовать по социальным сетям и собирать «телефоны, адреса, явки».

Ну и хозяева некоторых, особенно недавно организованных веб-ресурсов, любят наполнить свой сайт чужим контентом. Правда, они рискуют, поскольку поисковые системы быстро находят и банят любителей копипаста.

Основа работы парсера

Конечно же, парсеры не читают текста, они всего лишь сравнивают предложенный набор слов с тем, что обнаружили в интернете и действуют по заданной программе. То, как поисковый робот должен поступить с найденным контентом, написано в командной строке, содержащей набор букв, слов, выражений и знаков программного синтаксиса. Такая командная строка называется «регулярное выражение». Русские программисты используют жаргонные слова «маска» и «шаблон».

Чтобы парсер понимал регулярные выражения, он должен быть написан на языке, поддерживающем их в работе со строками. Такая возможность есть в РНР, Perl. Регулярные выражения описываются синтаксисом Unix, который хотя и считается устаревшим, но широко применяется благодаря свойству обратной совместимости.

Синтаксис Unix позволяет регулировать активность парсинга, делая его «ленивым», «жадным» и даже «сверхжадным». От этого параметра зависит длина строки, которую парсер копирует с веб-ресурса. Сверхжадный парсинг получает весь контент страницы, её HTML-код и внешнюю таблицу CSS.

Парсеры и PHP

Этот серверный язык удобен для создания парсеров:

Этические и технические сложности парсинга

Вопрос о том, является ли парсинг воровством контента, активно обсуждается во Всемирной сети. Большинство оппонентов считают, что заимствование части контента, не являющегося интеллектуальной собственностью, например, технических описаний, допустимо. Ссылка на первоисточник контента рассматривается как способ частичной легитимации. В то же время, наглое копирование, включая грамматические ошибки, осуждается интернет-сообществом, а поисковыми системами рассматривается как повод для блокировки ресурса.

Кроме этических проблем парсер способен создать и технические. Он автомат, робот, но его вход на сайт фиксируется, а входящий и исходящий трафики учитываются. Количество подключений к веб-ресурсу в секунду устанавливает создатель программы. Делать этот параметр очень большим нельзя, поскольку сервер может не переварить потока входящего трафика. При частоте 200–250 подключений в секунду работа парсера рассматривается как аналогичная DOS-атаке. Интернет-ресурс, к которому проявлено такое внимание, блокируется до выяснения обстоятельств.

Парсер можно написать самому или заказать на бирже фриланса, если вам требуются конкретные условия для поиска и чтения информации. Или купить эту программу в готовом виде с усредненным функционалом на специализированном веб-ресурсе.

iPipe – надёжный хостинг-провайдер с опытом работы более 15 лет.

Дорогие клиенты виртуального хостинга, мы рады сообщить о долгожданном нововведении → В панели управления Megatool доступен к выпуску бесплатный SSL…

Источник

Парсинг: что это такое простыми словами

Сегодня парсинг настолько распространен, что о нем должен знать каждый вебмастер, а маркетолог и подавно. Когда-нибудь его надо включать в список обязательных инструментов, ведь при грамотном использовании можно извлечь немало пользы. Процесс этот отличается от взлома, а если следовать инструкциям (прописанным в robots.txt на сайтах), то и вполне законный.

Что такое парсинг строки. Смотреть фото Что такое парсинг строки. Смотреть картинку Что такое парсинг строки. Картинка про Что такое парсинг строки. Фото Что такое парсинг строки

Что такое парсинг и что значит парсить

Дословный перевод слова parsing — делать грамматический разбор или структурировать. В программировании/информатике, это автоматический сбор и систематизация необходимых сведений, размещенных на веб-ресурсах с помощью специальных программ.

Принцип работы парсинга основывается на сравнении готового общепринятого шаблона и найденной в сети информации. Например, вы создали интернет-магазин и хотите его продвигать. Вам нужно скопировать данные о товарах (цены, изображения, описания) у конкурентов, а потом разместить на своем сайте. Делать это вручную — длительная и рутинная работа, особенно когда речь идет о 500-1000 товарах. Поэтому процесс автоматизируется, и сбор данных доверяется программе/сервису. Результатом станет колоссальная экономия времени.

Что такое парсинг строки. Смотреть фото Что такое парсинг строки. Смотреть картинку Что такое парсинг строки. Картинка про Что такое парсинг строки. Фото Что такое парсинг строки

Подробнее о преимуществах автоматического сбора данных:

Единственное, что не умеет делать парсер, это уникализировать информацию — контент просто собирается из открытых источников.

Программа парсер

В роли парсера может выступить программа, сервис или скрипт. Функция у них одна — собрать данные с указанных web-сайтов, анализировать и выдать в нужном формате. Обычно используют десктопные и облачные парсеры, основное преимущество которых в отсутствии необходимости скачивать программу и устанавливать на свой комп. Вся работа производится в облаке.

Вот, например, несколько облачных парсеров на русском языке.

А это пара десктопных сервисов:

Что такое парсинг слов и зачем нужно

Парсинг также активно применяется вебмастерами и оптимизаторами для сбора семантического ядра с дальнейшей кластеризацией запросов. Таким образом, инструмент может решить вопросы с продвижением сайта и составлением рекламной кампании в Яндекс.Директе и Гугл Адс.

Среди популярных программ для парсинга в Seo:

В этапы работ над семантическим ядром сайта входит — определение поисковых фраз, анализ конкурентов, сбор данных со всех источников и т. д.

Что такое парсинг товаров и зачем нужно

Парсить товары, значит — собирать нужную информацию о продукции из готового каталога онлайн-магазинов. Обычно это делается в целях анализа ценовой политики конкурентов или для заполнения витрины своих сайтов. Ручной сбор такой информации и тщательная сортировка занимает много времени, поэтому автоматизация процесса напрашивается априори.

Что такое парсинг строки. Смотреть фото Что такое парсинг строки. Смотреть картинку Что такое парсинг строки. Картинка про Что такое парсинг строки. Фото Что такое парсинг строки

Например, парсинг товаров часто используется владельцами крупных интернет-магазинов. Это позволяет избавиться от рутинной работы, увеличить скорость сбора данных и сделать процесс более качественным.

Вот как работает парсинг:

Что такое парсинг сайтов и зачем нужно

Парсинг сайтов бывает двух типов:

Алгоритм работы простой — машинальное извлечение открытых данных. Парсер переходит по ссылкам исследуемого сайта и собирает информацию по каждой странице. Сведения записываются в Excel или какой-нибудь другой файл.

Что такое парсинг аудитории и зачем нужно

Автоматический поиск и выгрузка данных о пользователях соцсетей по конкретному алгоритму называется парсингом аудитории. Данный процесс проводится на автомате (специальными программами) или вручную (таргетологи) — целью является выгрузка собранной информации в соответствующий рекламный кабинет.

Что такое парсинг строки. Смотреть фото Что такое парсинг строки. Смотреть картинку Что такое парсинг строки. Картинка про Что такое парсинг строки. Фото Что такое парсинг строки Парсинг аудиторий из Инстаграма и Фейсбука

Чаще всего аудиторию группы парсят по активным ее пользователям — админам, модераторам, редакторам или просто старожилам, регулярно публикующим контент. Такой метод позволяет быстро и точно подобрать ЦА под свою нишу. Это будут потенциальные покупатели, которых реально заинтересует товар или услуга. Таким образом, маркетолог сэкономит средства и время, а реклама не будет показываться всем подряд.

Парсинг по аудитории можно настроить еще точнее, используя различные критерии выбора — возраст, семейное положение, финансовый статус, хобби и интересы. В таком случае бюджет РК сократится еще больше, а вероятность покупок и целевых действий возрастет.

Что такое парсинг в программировании и зачем нужно

Принцип работы парсинга в программировании — сравнение строк или конкретных символов с готовым шаблоном, написанном на одном из языков. Другими словами, это процесс сопоставления и проверки стоковых данных, проводимый по определенным правилам. Цель — найти проблемы производительности, несоответствие кода требованиям и другие недостатки сайтов/ресурсов/приложений.

Обычно айтишники разрабатывают собственные парсеры на таких языках, как C++, Java Programing. Делается это из-за того что иногда требуемый синтаксический анализатор невозможно найти в свободном доступе.

На самом деле, парсинг в программировании не является чем-то сверх сложным. Рассмотрим, как он работает на примере разбора даты из строки.

Что такое парсинг строки. Смотреть фото Что такое парсинг строки. Смотреть картинку Что такое парсинг строки. Картинка про Что такое парсинг строки. Фото Что такое парсинг строки

С первого взгляда это какой-то непонятный код, но если приглядеться, то можно разобрать узнаваемые части.

Что такое парсинг строки. Смотреть фото Что такое парсинг строки. Смотреть картинку Что такое парсинг строки. Картинка про Что такое парсинг строки. Фото Что такое парсинг строки

Примерно таким же способом осуществляется синтаксический анализ целого языка. Строки делятся на маленькие биты синтаксиса. Парсинг применяется не только в программировании, но также в аналитике и любой другой области, где можно работать с данными в стоковом формате.

Что такое парсинг в Инстаграм и зачем нужно

Парсинг в Инсте используют как один из инструментов для работы с ЦА — чтобы отсортировать пользователей, заинтересованных в товаре. Благодаря этому снижается рутина и экономится время.

Что такое парсинг строки. Смотреть фото Что такое парсинг строки. Смотреть картинку Что такое парсинг строки. Картинка про Что такое парсинг строки. Фото Что такое парсинг строки

У парсинга в Instagram имеются широкие возможности анализа и мониторинга. Инструмент помогает собрать всю нужную информацию и наладить взаимодействие с пользователями. Вот что с его помощью получится сделать в Инстаграме:

Все эти функции позволят точечно запустить рекламную кампанию, настроить таргет и оформить «вкусное» коммерческое предложение.

Что такое парсинг Авито и зачем нужно

Парсинг полезен также в Авито — самой популярной доски объявлений в Рунете. С его помощью можно получить информацию обо всех постах, размещенных в определенных категориях, включая номера телефонов и адреса.

Что такое парсинг строки. Смотреть фото Что такое парсинг строки. Смотреть картинку Что такое парсинг строки. Картинка про Что такое парсинг строки. Фото Что такое парсинг строки

Чтобы спарсить данные с Avito, достаточно сделать так:

Инструмент соберет всю требуемую информацию в течение дня (в зависимости от объема данных) и выгрузит в документ. Обычно арбитражникам и маркетологам бывают нужны имена/контакты людей, цены на товары и изображения.

Полученные сведения можно использовать для отправки уведомлений на email, Gold calling, заполнения собственных площадок, анализа конкурентов и много чего еще. Сейчас есть возможность применять несколько парсеров для Авито — AvitoMonsterParser, FastParserAvito, Avi2-parser и другие.

Что такое парсер выдачи и зачем нужно

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

Что такое парсинг строки. Смотреть фото Что такое парсинг строки. Смотреть картинку Что такое парсинг строки. Картинка про Что такое парсинг строки. Фото Что такое парсинг строки Ттак выглядит парсер на Яндекс

В первую очередь такой сбор данных нужен для анализа сайтов конкурентов. Парсинг даст возможность определить лидеров топа, узнать их характеристики в разрезе Seo. Например, вот какие данные чужих ресурсов:

Предоставленная информация поможет специалисту найти качественные сайты-доноры для размещения на них обратных ссылок, потенциальных клиентов/партнеров, а также площадки для рекламы.

Что такое парсинг цен и зачем нужно

Обычно ценовая «разведка», а в частности про оборот товара осложняется тем, что некоторые компании скрывают такую информацию. Напротив, такие гиганты, как Wildberries, Lamoda, Leroy Merlin ее открыто выставляют. На основе этих данных можно будет составить общее представление о продажах и сделать полезные выводы. К примеру, определить самые продаваемые позиции и сфокусироваться на них, а дешевые отсечь.

Что такое парсинг строки. Смотреть фото Что такое парсинг строки. Смотреть картинку Что такое парсинг строки. Картинка про Что такое парсинг строки. Фото Что такое парсинг строки

Цены можно парсить из разметки shema.org — это самый простой способ. Но если стоимость бывает зачеркнута или прайс с остатками товара загружается отдельными запросами к серверу, приходится использовать более функциональные программы. Сегодня есть такие проги, которые умеют раскрывать информацию методом эмулирования.

Кейсы по заработку на парсинге

Существует несколько способов заработка на парсинге. Но обычно заказчиков интересуют:

Ниже представлен интересный кейс от CatalogLoader, решивший задачи компании, закупающейся в буржунете и продающей на Яндекс.Маркете.

Что надо было сделать:

Задача решилась эффективно, клиент получил все необходимые данные. Использовался парсер сервиса CatalogLoader.com, собравший всю актуальную информацию с зарубежного интернет-магазина по нужным категориям/брендам. Сведения выгрузили в Price-Matrix.ru, где можно их анализировать и делать переоценку.

Что такое парсинг строки. Смотреть фото Что такое парсинг строки. Смотреть картинку Что такое парсинг строки. Картинка про Что такое парсинг строки. Фото Что такое парсинг строки

Еще один кейс, выложенный на сайте im-business. К ним обратился клиент, занимающийся грузоперевозками Россия-Беларусь. Ниша оказалась весьма конкурентной, поэтому человеку приходилось держать постоянный штат операторов и регулярно обновлять сайты с запросами на перевозку — чтобы не упустить заказы, иначе конкуренты не спят.

Задача для команды была следующая: спарсить информацию с 5 сайтов, которые постоянно мониторят заявки и отбирают их по определенным критериям. Сложность была в том, что все площадки разные — для некоторых требовалась регистрация. Пришлось в настройках прописать код для авторизации.

Дальше сделали так:

Все полученные данные сохраняли в общей таблице, каждый параметр по своим ячейкам. Заказчику давалась возможность отфильтровывать грузы, отмечать взятые в работу, а обработанные заявки выгружать для логиста.

Что такое парсинг строки. Смотреть фото Что такое парсинг строки. Смотреть картинку Что такое парсинг строки. Картинка про Что такое парсинг строки. Фото Что такое парсинг строки

Результат — удалось сбросить значительную нагрузку с операторов фирмы, заявки стали обнаруживаться гораздо быстрее. Все это позволило опережать конкурентов и выходить в профит.

Заключение

Если у вас растущий бизнес или вы просто торгуете широко распространенными товарами, с парсингом вам придется столкнуться рано или поздно. Ничего противозаконного в нем нет, особенно при получении информации с интернет-магазинов. Здесь вы не нарушите закон о персональных данных или чьи-то авторские права

Источник

Что такое парсинг и как правильно парсить

Что такое парсинг строки. Смотреть фото Что такое парсинг строки. Смотреть картинку Что такое парсинг строки. Картинка про Что такое парсинг строки. Фото Что такое парсинг строки

Что такое парсинг строки. Смотреть фото Что такое парсинг строки. Смотреть картинку Что такое парсинг строки. Картинка про Что такое парсинг строки. Фото Что такое парсинг строки

Что такое парсинг данных должен знать каждый владелец сайта, планирующий серьёзно развиваться в бизнесе. Это явление настолько распространено, что рано или поздно с парсингом может столкнуться любой. Либо как заказчик данной операции, либо как лицо, владеющее объектом для сбора информации, то есть ресурсом в Интернете.

К парсингу в российской бизнес-среде часто наблюдается негативное отношение. По принципу: если это не незаконно, то уж точно аморально. На самом деле из его грамотного и тактичного использования каждая компания может извлечь немало преимуществ.

Что такое парсинг строки. Смотреть фото Что такое парсинг строки. Смотреть картинку Что такое парсинг строки. Картинка про Что такое парсинг строки. Фото Что такое парсинг строки

Что такое парсинг

Глагол “to parse” в дословном переводе не означает ничего плохого. Делать грамматический разбор или структурировать — действия полезные и нужные. На языке всех, кто работает с данными на сайтах это слово имеет свой оттенок.

Парсить — собирать и систематизировать информацию, размещенную на определенных сайтах, с помощью специальных программ, автоматизирующих процесс.

Если вы когда-либо задавались вопросом, что такое парсер сайта, то вот он ответ. Это программные продукты, основной функцией которых является получение необходимых данных, соответствующих заданным параметрам.

Законно ли использовать парсинг

После выяснения что такое парсинг, может показаться, что это нечто, не соответствующее нормам действующего законодательства. На самом деле это не так. Законом не преследуется парсинг. Зато запрещены:

Парсинг законен, если он касается сбора информации, находящейся в открытом доступе. То есть всего, что можно и так собрать вручную.

Парсеры просто позволяют ускорить процесс и избежать ошибок из-за человеческого фактора. Поэтому «незаконности» в процесс они не добавляют.

Другое дело, как владелец свежесобранной базы распорядится подобной информацией. Ответственность может наступить именно за последующие действия.

Для чего нужен парсинг

Что такое парсить сайт разобрались. Переходим к тому, зачем же это может понадобиться. Здесь открывается широкий простор для действий.

Основная проблема современного Интернета — избыток информации, которую человек не в состоянии систематизировать вручную.

Парсинг используется для:

Сквозная аналитика это тоже своеобразный парсинг, только рекламы и продаж. Система интегрируется с площадками и CRM, а потом автоматически соединяет данные о бюджетах, кликах, сделках и подсчитывает окупаемость каждой кампании. Используйте ее, чтобы не потеряться в большом количестве информации и видеть в отчетах то, что вам действительно нужно. Отчеты Calltouch легко кастомизировать под себя и задачи команды маркетологов.

Сквозная аналитика

Что такое парсинг строки. Смотреть фото Что такое парсинг строки. Смотреть картинку Что такое парсинг строки. Картинка про Что такое парсинг строки. Фото Что такое парсинг строки

Достоинства парсинга

Они многочисленны. По сравнению с человеком парсеры могут:

Ограничения при парсинге

Есть несколько вариантов ограничений, которые могут затруднить работу парсера:

Какую информацию можно парсить

Спарсить можно всё, что есть на сайте в открытом доступе. Чаще всего требуются:

Изображения с сайтов технически спарсить тоже можно, но, как уже упоминалось выше, если они защищены авторским правом, лучше не нужно. Нельзя собирать с чужих сайтов личные данные их пользователей, которые те вводили в личных кабинетах.

Парсинг часто используется в индустрии e-commerce. Оценить влияние парсинга и его результатов можно в сквозной аналитике для интернет-магазинов. Вам доступны отчеты по любым временным срезам, метрикам и товарам. С помощью этих данных вы узнаете, из каких источников вы получаете добавления в корзины и продажи, и сможете оптимизировать рекламу с опорой на эти данные.

Модуль е-коммерс

Что такое парсинг строки. Смотреть фото Что такое парсинг строки. Смотреть картинку Что такое парсинг строки. Картинка про Что такое парсинг строки. Фото Что такое парсинг строки

Алгоритм работы парсинга

Принцип действия программы зависит от целей. Но схематично он выглядит так:

Способы применения

Основных способов применения парсинга существует два:

Обычно оба варианта работают в тесной связке друг с другом. Например, анализ ценовых позиций у конкурентов отталкивается от имеющегося диапазона на собственном сайте, а обнаруженные новинки сопоставляются с собственной товарной базой и т. п.

Источник

Про LL-парсинг: Подход к синтаксическому анализу через концепцию нарезания строки

Приветствую уважаемое сообщество!

Повторение — мать учения, а разбираться в синтаксическом анализе — очень полезный навык для любого программиста, поэтому хочу еще раз поднять эту тему и поговорить в этот раз про анализ методом рекурсивного спуска (LL), обойдясь без лишних формализмов (к ним потом всегда можно будет вернуться).

Как пишет великий Д. Строгов, «понять — значит упростить». Поэтому, чтобы понять концепцию синтаксического разбора методом рекурсивного спуска (оно же LL-парсинг), упростим задачу насколько можно и вручную напишем синтаксический анализатор формата, похожего на JSON, но более простого (при желании можно будет потом его расширить до анализатора полноценного JSON, если захочется поупражняться). Напишем его, взяв за основу идею нарезания строки.

В классических книгах и курсах по конструированию компиляторов обычно начинают объяснять тему синтаксического разбора и интерпретации, выделяя несколько фаз:

Я сейчас хочу использовать немного другой подход к этой же самой концепции (LL-разбора) и показать, как можно построить LL-анализатор, взяв за основу идею нарезания строки: от исходной строки в процессе разбора отрезаются фрагменты, она становится меньше, а затем разбору подвергается оставшаяся часть строки. В итоге мы придем к той же самой концепции рекурсивного спуска, но немного другим путем, чем это обычно делается. Возможно, этот путь окажется удобнее для понимания сути идеи. А если и нет, то это все равно возможность посмотреть на рекурсивный спуск с другого ракурса.

Начнем с более простой задачи: есть строка с разделителями, и хочется написать итерацию по ее значениям. Что-то вроде:

Как это можно сделать? Стандартный способ — преобразовать строку с разделителями в массив или список с помощью String.split (в Java), или names.split(«,») (в javascript), и сделать итерацию уже по массиву. Но представим, что преобразование в массив использовать не хотим или не можем (например, ну вдруг если мы программируем на языке программирования AVAJ++, в котором нету структуры данных “массив”). Можно еще сканировать строку и отслеживать разделители, но этот способ я использовать тоже не буду, потому что он делает код цикла итерации громоздким и, главное, это идет вразрез с концепцией, которую я хочу показать. Поэтому мы будем относиться к строке с разделителями таким же образом, как относятся к спискам в функциональном программировании. А там для них всегда определяют функции head (получить первый элемент списка) и tail (получить остаток списка). Начиная еще с первых диалектов лиспа, где эти функции назывались совершенно ужасно и неинтуитивно: car и cdr (car = content of address register, cdr = content of decrement register. Преданья старины глубокой, да, эхехех.).

Наша строка — это строка с разделителями. Подсветим разделители фиолетовым:

Что такое парсинг строки. Смотреть фото Что такое парсинг строки. Смотреть картинку Что такое парсинг строки. Картинка про Что такое парсинг строки. Фото Что такое парсинг строки

А элементы списка подсветим желтым:

Что такое парсинг строки. Смотреть фото Что такое парсинг строки. Смотреть картинку Что такое парсинг строки. Картинка про Что такое парсинг строки. Фото Что такое парсинг строки

Будем считать, что наша строка мутабельна (ее можно изменять) и напишем функцию:

Что такое парсинг строки. Смотреть фото Что такое парсинг строки. Смотреть картинку Что такое парсинг строки. Картинка про Что такое парсинг строки. Фото Что такое парсинг строки

Ее сигнатура, например, может быть такой:

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

В результате мы получили возможность написать вот так:

Выводит, как и ожидалось:

ivanov
petrov
sidorov

Мы обошлись без конвертации в ArrayList, но зато испортили переменную names, и в ней теперь пустая строка. Выглядит пока не очень полезно, как будто поменяли шило на мыло. Но давайте пойдем дальше. Там мы увидим, зачем это было надо и куда это нас приведет.

Давайте теперь разбирать что-нибудь поинтереснее: список из пар “ключ-значение”. Это тоже очень частая задача.

Тоже ожидаемо. И то же самое можно достичь с помощью String.split, без нарезания строк.
Но допустим, что теперь нам захотелось усложнить наш формат и от плоского key-value перейти к формату, допускающему вложенность, напоминающему JSON. Теперь мы хотим читать что-то такое:

По какому разделителю делать split? Если по запятой, то в одном из токенов у нас окажется строка

Явно не то, что нам нужно. Поэтому надо обратить внимание на структуру той строки, которую мы хотим разобрать.

Она начинается с фигурной скобки и заканчивается фигурной скобкой (парной к ней, что важно). Внутри этих скобок находится список пар ‘ключ’:’значение’, каждая пара отделена от следующей пары запятой. Ключ и значение разделяется двоеточием. Ключ — это строка из букв, заключенная в апострофы. Значение может быть строкой символов, заключенных в апострофы, а может быть такой же структурой, начинающейся и заканчивающейся парными фигурными скобками. Назовем такую структуру словом “объект”, как и принято называть ее в JSON.

Только что мы в неформальной форме описали грамматику нашего, напоминающего JSON, формата. Обычно грамматики описываются наоборот, в формальной форме, и для их записи применяется BNF-нотация или ее вариации. Но сейчас я обойдусь без этого, и мы просто посмотрим, как можно “нарезать” эту строку, чтобы ее по правилам этой грамматики разобрать.

В самом деле, наш “объект” начинается с открывающей фигурной скобки и заканчивается парной ей закрывающей. Что может делать функция, разбирающая такой формат? Скорее всего, следующее:

Также теперь нам надо обратить внимание, что у нас появилось понятие “парная скобка” в дополнение к понятию “разделитель”. Если для нарезания строки до следующего разделителя (двоеточие между ключом и значением, запятая между парами “ключ: значение”) нам было достаточно функции cutNextToken, то теперь, когда в качестве значения у нас может выступать не только строка, но и объект, нам понадобится функция “отрезать до следующей парной скобки”. Примерно такая:

Что такое парсинг строки. Смотреть фото Что такое парсинг строки. Смотреть картинку Что такое парсинг строки. Картинка про Что такое парсинг строки. Фото Что такое парсинг строки

Эта функция отрезает от строки фрагмент от открывающей скобки до парной ей закрывающей, учитывая вложенные скобки, если они есть. Конечно, можно не ограничиваться скобками, а использовать подобную функцию для отрезания разных блочных структур, допускающих вложенность: операторных блоков begin..end, if..endif, for..endfor и аналогичных им.

Нарисуем графически, что будет происходить со строкой. Бирюзовый цвет — это значит мы сканируем строку вперед на символ, выделенный бирюзовым, чтобы определить, что нам делать дальше. Фиолетовый — это “что отрезать, это когда мы отрезаем от строки фрагменты, выделенные фиолетовым, и то, что осталось, продолжаем разбирать дальше.

Что такое парсинг строки. Смотреть фото Что такое парсинг строки. Смотреть картинку Что такое парсинг строки. Картинка про Что такое парсинг строки. Фото Что такое парсинг строки

Для сравнения, вывод программы (текст программы приведен в приложении), разбирающей эту строку:

Демонстрация разбора JSON-подобной структуры

Мы в любой момент знаем, что мы ожидаем найти в нашей входной строке. Если мы вошли в функцию parseJsonObject, то мы ожидаем, что нам туда передали объект, и можем это проверить по наличию открывающей и закрывающей скобки в начале и в конце. Если мы вошли в функцию parseJsonPairList, то мы ожидаем там список пар “ключ: значение”, и после того, как мы “откусили” ключ (до разделителя “:”), мы ожидаем, что следующее, что мы “откусываем” — это значение. Мы можем посмотреть на первый символ значения, и сделать вывод о его типе (если апостроф — то значение имеет тип “строка”, если открывающая фигурная скобка — то значение имеет тип “объект”).

Таким образом, отрезая от строки фрагменты, мы можем выполнить ее синтаксический разбор методом нисходящего анализа (рекурсивного спуска). А когда мы можем выполнить синтаксический разбор, то мы можем разбирать нужный нам формат. Или придумать свой, удобный нам формат и разбирать его. Или придумать DSL (Domain Specific Language) для нашей конкретной области и сконструировать интерпретатор для него. И сконструировать правильно, без вымученных решений на регекспах или самопальных state-машинах, которые возникают у программистов, которые пытаются решить какую-нибудь задачу, требующую синтаксического разбора, но не вполне владеют материалом.

Вот. Поздравляю всех с наступившим летом и желаю добра, любви и функциональных парсеров 🙂

Для дальнейшего чтения:

Идеологическое: пара длинных, но стоящих прочтения статей Стива Йегге (англ.):

You either learn compilers and start writing your own DSLs, or your get yourself a better language

The first big phase of the compilation pipeline is parsing

Type casts, narrowing and widening conversions, friend functions to bypass the standard class protections, stuffing minilanguages into strings and parsing them out by hand, there are dozens of ways to bypass the type systems in Java and C++, and programmers use them all the time, because (little do they know) they’re actually trying to build software, not hardware.

Техническое: две статьи, посвященных синтаксическому анализу, про отличие LL и LR-подходов (англ.):
LL and LR Parsing Demystified
LL and LR in Context: Why Parsing Tools Are Hard

И еще глубже в тему: как написать интерпретатор Лиспа на C++
Lisp interpreter in 90 lines of C++

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *