Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.02.2014, 11:28   #1
Fahman
Форумчанин
 
Аватар для Fahman
 
Регистрация: 03.04.2013
Сообщений: 703
По умолчанию Регулярные выражения

Всем привет, недавно совсем начал изучать регулярные выражения и и мне надо с мемо1 спарсить 1 тег в мемо2 его записать так вот сделал так:

Код:
<td class="center time">17:00</td>
// Сохроняет только первый тег а таких тегов 8-10 шт. 
procedure TForm1.Button4Click(Sender: TObject);
   var
RegExp: TRegExpr;
begin
 RegExp := TRegExpr.Create;
 RegExp.InputString :=Memo1.Text;
 RegExp.Expression :='<td class="center time">(.*?)</td>';
 if RegExp.Exec then
 begin
  Memo2.Text:=(RegExp.Match[1]);
 end;
 RegExp.Free;
end;
он сохраняет только перво найденный тег а таких там около 10-15 когда как каждый день по разному в мемо2 хочу вывести так

13:00
14:00
и Т.п.

Что я сделал не так?
З.Ы. В первые сталкиваюсь с реулярками (Извиняйте если не так написал);
99% ошибок компьютера сидит в полуметре от монитора.
Fahman вне форума Ответить с цитированием
Старый 12.02.2014, 11:47   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,312
По умолчанию

Не проверял:
Код:
memo2.lines.beginupdate;
if RegExp.Exec then
 repeat
  memo2.lines.add(RegExp.Match[1]);
 until not RegExp.ExecNext;
memo2.lines.endupdate;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 12.02.2014, 11:48   #3
Fahman
Форумчанин
 
Аватар для Fahman
 
Регистрация: 03.04.2013
Сообщений: 703
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Не проверял:
Код:
memo2.lines.beginupdate;
if RegExp.Exec then
 repeat
  memo2.lines.add(RegExp.Match[1]);
 until not RegExp.ExecNext;
memo2.lines.endupdate;
Спасибо, не дома не могу про тестировать)
99% ошибок компьютера сидит в полуметре от монитора.
Fahman вне форума Ответить с цитированием
Старый 12.02.2014, 12:24   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

так ты только первый тэг и берешь....
memo2.lines.add(RegExp.Match[1]);
Человек_Борща вне форума Ответить с цитированием
Старый 12.02.2014, 12:47   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,312
По умолчанию

Человек_Борща, этот цикл не я придумал (if RegExp.Exec then repeat ... until not RegExp.ExecNext; ). Сейчас проверил - выводит не одно время.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 12.02.2014, 13:00   #6
Максим_83
Пользователь
 
Регистрация: 09.02.2012
Сообщений: 39
По умолчанию

Думаю тебе поможет, сам немного воевал с парсингом по регуляркам.
Код:
procedure TForm1.Button2Click(Sender: TObject);
var
  Doc, Elems, Elem : Variant;
  TagName, ClassName, Content : String;
  i : Integer;
  reg:TRegExpr;
list:string;
begin
  //ссылка на страницу
  Doc := WebBrowser1.OleObject.document;
  if TVarData(Doc).VDispatch = nil then begin
    ShowMessage('Страница не загружена, действие отменено.');
    Exit;
  end;
  TagName := Edit2.Text;
  if TagName = '' then begin
    ShowMessage('Тэг не задан, действие отменено.');
    Exit;
  end;
  ClassName := Edit3.Text;
  if ClassName = '' then begin
    ShowMessage('Класс не задан, действие отменено.');
    Exit;
  end;
  //ÏПолучаем элементы по тэгу заданных в ClassName.
  Elems := Doc.getElementsByTagName(TagName);
  //перебор всех элементов.
  for i := 0 to Elems.length - 1 do begin
    //ссылка на следующие элементы.
    Elem := Elems.item(i);
    //проверяем класс.
        if Elem.className = ClassName then begin
      Content := Elem.innerHTML; //внутреннее HTML содержание элемента.
reg:=TRegExpr.Create;
list:=Content;
reg.Expression:= edit4.Text;// регулярка
if reg.Exec(list) then
repeat
memo1.Lines.Add(reg.Match[1]);
until not reg.ExecNext;
reg.Free;
    end;
end;
  end;
Максим_83 вне форума Ответить с цитированием
Старый 15.02.2014, 08:35   #7
Fahman
Форумчанин
 
Аватар для Fahman
 
Регистрация: 03.04.2013
Сообщений: 703
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Человек_Борща, этот цикл не я придумал (if RegExp.Exec then repeat ... until not RegExp.ExecNext; ). Сейчас проверил - выводит не одно время.
Спасибо все работает просто на работе не могу ответить=) регулярные выражения интересная вещь и очень удобная=)
99% ошибок компьютера сидит в полуметре от монитора.
Fahman вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Регулярные выражения в F# Лёличка Общие вопросы .NET 1 18.01.2012 20:15
Регулярные выражения sem_1989 JavaScript, Ajax 2 06.08.2011 21:45
регулярные выражения brulik67 PHP 4 24.06.2011 06:14
регулярные выражения Aleksey1408D PHP 5 05.06.2011 07:41
Регулярные выражения Marsik Помощь студентам 4 14.11.2009 14:13