Методы парсинга в delphi (Регулярные Выражения)

  • На форуме работает ручное одобрение пользователей. Это значит, что, если Ваша причина регистрации не соответствует тематике форума, а также Вы используете временную почту, Ваша учётная запись будет отклонена без возможности повторной регистрации. В дальнейшем - пожизненная блокировка обоих аккаунтов за создание мультиаккаунта.
  • Мы обновили Tor зеркало до v3!
    Для входа используйте следующий url: darkv3nw2...bzad.onion/
  • Мы вновь вернули telegram чат форуму, вступайте, общайтесь, задавайте любые вопросы как администрации, так и пользователям!
    Ссылка: https://t.me/chat_dark_time

TITLE

Участник

TITLE

Участник
22 Июл 2016
86
106
Код:
if pos('кот', memo.text) <> 0 then ... (удаление, копирование, прочее).
от этот процесс и есть парсинг. Казалось бы, что тут сложного? Сложного - ничего, а вот если ты начинающий программист, то я могу показать несколько способов этого самого парсинга, что в дальнейшем упростит тебе работу с текстом, будь то код страницы или же обычный текстовый файл. Первый, это конечно, обычные и родные ещё из pascal'я строковые функции. В парсинге, чаще всего, используются 4 основных:
Код:
pos ('что', 'где'); //пример: pos('кот', memo1.text);
copy ('где', i, n); // где i - позиция символа, с которого начинать копирование, а N - количество символов
delete ('где', i, n);  //аналогично с предыдущим, но уже удаляет заданное кол-во символов
length (string); //где string - переменная типа String. Функция возвращает количество символов переданного ей слова/текста
Скорее всего всё это ты уже знаешь, так что следующий пример сложности у тебя не вызовет:
Код:
var s, st: string;
begin
s:= memo1.text;
delete(s, pos('кот', s)+3, length(s) );
st:= copy(s, pos('кот', s), length(s) );
end;
В первой строке мы удалили из переменной s всё, начиная от конца слова "кот". Во второй мы скопировали это слово. Именно так происходит парсинг какого-либо значения.

Теперь рассмотрим первую фишку, которая поможет тебе спарсить, например, все слова между какими-либо символами. За исходный текст возьмём исходный код какого-либо сайта, а парсить будем все ссылки. Ссылки у нас обычно между чего? Между кавычками, начинается с <a href=", а заканчивается "/> (пример: <a href=''ссылка"/>). Т.е. видим, что ссылка между 2-мя символами (набором символов). Нужно её оттуда достать. Для работы нам нужна библиотека regExpr. Скачать её можно будет в конце статьи.

Что такое регулярные выражения? Это некоторые выражения, которые позволяют указать, откуда и что вырывать. Пишутся они на специальном синтаксисе, который понять совсем не сложно.

Установили библиотеку, после чего в uses пишем RegExpr, а в Var создаём переменную reg: TregExpr; (тип регулярных выражений). Ну и пошли рассматривать пример:
Код:
var reg: TregExpr;
begin
reg:= TregExpr.Create; //Инициализируем переменную
reg.InputString:= memo1.text; //InputText - текст, в котором будем искать условия, удовлетворяющие регулярке
reg.Expression:='href="(.*?)"'; //регулярное выражение
if reg.Exec(memo1.text) then //Если найдено совпадение в memo1, то
repeat
memo2.lines.add(reg.Match[0]); добавляем в memo2 строку с совпадением
until not reg.ExecNext; //и так пока не закончатся совпадения (reg.NextExec - следующее совпадение)
end;
Вопросы? Вопросы конечно есть. Всё по порядку.

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

Далее самое интересное, сама регулярка. Задание регулярки берёт на себя свойство Expression.

Мы видим, что в регулярном выражении я указал следующее:
Код:
reg.Expression:='href="(.*?)"';
Код:
<a href=" - символы, с которых начинается ссылка
<a href=" - символы, с которых начинается ссылка

"> - символы, которыми она заканчивается. А вот загадочное (.*?) означает ЛЮБОЕ выражение, заключённое между этими символами. Вот если регулярка сработает на нём в тексте, то данное выражение ложится в свойство Match[0]. Где 0 -1-ое совпадение. Это не значит, что если в тексте будет вторая ссылка, то она ляжет в match[1], нет. Это значит, что всё, что попадёт под первое условие регулярки, будет лежать в [0].

Если, например, мы дополним запрос на такой:

reg.Expression:='href="(.*?)"(.*>)a'; , то второе условие - будет вот: "(.*>)a. Всё, что на нём сработает, будет находится в reg.match[1].

Проще говоря, сколько (.*?), сколько и условий. Ну что, теории достаточно? Проверим на практике.

Ну и вставляем весь тот код, что был оговорён выше:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var reg: TregExpr;
begin
reg:= TregExpr.Create;
reg.InputString:= memo1.text;
reg.Expression:='href="(.*?)"';
if reg.Exec then
repeat
memo2.lines.add(reg.Match[0]);
until not reg.ExecNext;
end;
Запускаем и видим, что все ссылки спарсены. На этом всё
 
  • Лайк
Reactions: colas

О нас

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

    Dark-Time 2015 - 2022

    При поддержке: XenForo.Info

Быстрая навигация

Меню пользователя