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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.07.2009, 20:22   #1
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
Вопрос RegExpr - как составить выражение для содержимого с Bash.org

Имеется:
Код:
<hr class="iq"> 
<div class="q">
<div class="vote">
<a href="/quote/403854">403854</a>
[ <a href="/quote/403854/rulez" onclick="v(403854, 0, 0); return false;">+</a> <span id="v403854">1679</span> <a href="/quote/403854/sux" onclick="v(403854, 1, 0); return false;">&minus;</a> ]
<a href="/quote/403854/bayan" onclick="v(403854, 2, 0); return false;">[:||||:]</a>
утверждена 2009-07-08 в 09:12
</div>
<div>Понял суть американского футбола, когда увидел, как бабушка кинула рыбью голову в середину стайки куриц...</div>
</div>
Как составить выражение для RegExpr, чтобы он вытащил всё, то что зелёным, помеченное. Красным не влияет на процесс, его можно не учитывать. Этот пример текста, из большего куска.
Пока что только сами цитаты вытаскивает из DIV секций, не понятно, как задать одним выражением всю структуру для парсинга.
Вот что есть:
Код:
procedure TForm1.Parse(s: string);
var
  reg: TRegExpr;
begin
  reg := TRegExpr.Create;
  BufTxt.Clear;
  try
    reg.ModifierG  := False;
    reg.ModifierM  := True;
 //1) Ссылка на цитату и Номер цитаты ->   <a href="/quote/403827">403827</a>
 //2) Рейтинг(тут 7640) -> [ <a href="/quote/403827/rulez" onclick="v(403827, 0, 0); return false;">+</a> <span id="v403827">7640</span> <a href="/quote/403827/sux" onclick="v(403827, 1, 0); return false;">&minus;</a> ]
 //3) Дата утверждения -> [:||||:]</a>
 //				утверждена 2009-07-05 в 09:13
 //			</div>
 //4) Сама цитата ->    <div>...<\/div>
    reg.Expression := '<div>(.*?)<\/div>'; // что тут и как дописать
    if reg.Exec(s) then
    Repeat
     BufTxt.Add('----------------------------------------------');
     BufTxt.Add(reg.Match[1] +#13#10);
    Until not reg.ExecNext;
  finally
    sMemo1.Text := BufTxt.Text;
    reg.Free;
  end;
end;
Вот новую версию компонета нашёл RegExpr 0.952:
Вложения
Тип файла: rar TRegExpr 0.952.rar (34.8 Кб, 41 просмотров)

Последний раз редактировалось Alter; 08.07.2009 в 22:21.
Alter вне форума Ответить с цитированием
Старый 14.07.2009, 00:02   #2
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
Восклицание Никто не понимает как?

Допустим имеется блок:
Цитата:
<hr class="iq">
<div class="q">
<div class="vote">
<a href="/quote/403896">403896</a>
утверждена 2009-07-13 в 09:46
</div>
<div>Текст Текст Текст</div>
</div>
Как тут выражение сделать, чтобы доставало нужное?

Это виснет:
Код:
procedure TForm1.Parse(s: string);
var
  reg: TRegExpr;
  Test :String;
begin
  reg := TRegExpr.Create;
  sMemo1.Clear;
  BufTxt.Clear;
  try
    reg.ModifierG  := False;
    reg.ModifierM  := True;

 Test := '<div class="vote">'+
     '\s.<a href="(.*?)">(.*?)<\/a>\s.'+
     '(.*?)<\/div>'+
     '<div>(.*?)<\/div>'+'\s.'+'<\/div>';

    reg.Expression := Test; 
    if reg.Exec(s) then
    Repeat
     BufTxt.Add('----------------------------------------------');
     BufTxt.Add(reg.Match[1] +#13#10 + reg.Match[2]+reg.Match[3] +#13#10 + reg.Match[4]);
    Until not reg.ExecNext;
  finally
    sMemo1.Text := BufTxt.Text; 
    reg.Free;
  end;
end;
как переделать-сделать, чтоб работало.
Alter вне форума Ответить с цитированием
Старый 14.07.2009, 00:45   #3
QunneD
C++ &amp;amp; PHP &amp;amp; Asm
Форумчанин
 
Аватар для QunneD
 
Регистрация: 06.12.2008
Сообщений: 300
По умолчанию

Memo1.Text
Цитата:
<hr class="iq">
<div class="q">
<div class="vote">
<a href="/quote/403896">403896</a>
утверждена 2009-07-13 в 09:46
</div>
<div>Текст Текст Текст</div>
</div>
Код:
var
  a,b,g,h,j,k : integer;
  ab, bb, gg, hh, jj, kk, ll, zz, xx, cc, vv : string;
  var1, var2, var3 : string;
begin
  ab := '<a href="/quote/';
  bb := '">';
  kk := '</a>';
  ll := '</div';
  cc := '<div>';
  a := pos(ab, memo1.Text);
  gg := copy(memo1.Text, 56+length(ab), length(memo1.Text));
  b := pos(bb, gg);
  hh := copy(gg, 1, b-1);
  var1 := hh; // ид
  jj := copy(gg, b+2, length(memo1.text));
  g := pos(kk, jj);
  h := pos(ll,jj);
  zz := copy(jj, g+length(kk), h-length(ll)-length(ll)-1);
  var2 := zz; // утверждена
  xx := copy(jj, h+length(ll)+1, length(jj));
  j := pos(cc, xx);
  k := pos(ll, xx);
  vv := copy(xx, j+length(cc), k-length(ll)-3);
  var3 := vv; // текст
  showmessage('ID: '+var1+#13#10+'Утверждена: '+var2+#13#10+'Текст: '+var3+'.');
end;
Хоть и много лишнего, но зато работает и не виснет Надеюсь помог.

Последний раз редактировалось QunneD; 14.07.2009 в 01:12. Причина: Дописал код до конца, и добавил коммент
QunneD вне форума Ответить с цитированием
Старый 14.07.2009, 01:15   #4
QunneD
C++ &amp;amp; PHP &amp;amp; Asm
Форумчанин
 
Аватар для QunneD
 
Регистрация: 06.12.2008
Сообщений: 300
По умолчанию

Только не посмотрел через что нужно было сделать :D
QunneD вне форума Ответить с цитированием
Старый 14.07.2009, 19:45   #5
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Так то, но хотелось через регулярные выражения сделать. Ведь проще через них. Если никто не сможет задать регулярные выражения, то придётся Copy и Pos использовать.
Alter вне форума Ответить с цитированием
Старый 17.07.2009, 18:26   #6
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Спасибо Metandrostenalon что хоть ты помог.
Подкорекировал слегка выражение, стало:
Код:
'<div[\s]+class=\"vote\">[\s]*<a[\s]+href=\"([a-z0-9\/]+)\">([0-9]+)<\/a>[\s]*.+?утверждена[\s]+([-в0-9: ]+)[\s]*<\/div>[\s]*<div>(.+?)<\/div>'
И одновремменно добавил в код уборку оценочных ссылок из текста, теперь результат этого выглядит так:
Цитата:
<div class="vote">
<a href="/quote/403937">403937</a>
<span id="v403937">1979</span>
утверждена 2009-07-17 в 10:44
</div>
<div>Тело текста</div>
</div>
То что розовым, дополнительно вытащить из текта, что возможно добавить в выражение для этого?
Alter вне форума Ответить с цитированием
Старый 17.03.2012, 01:07   #7
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

Цитата:
<div[\s]+class=\"vote\">[\s]*<a[\s]+href=\"([a-z0-9\/]+)\">([0-9]+)<\/a>[\s]*.+?утверждена[\s]+([-в0-9: ]+)[\s]*<\/div>[\s]*<div>(.+?)<\/div>
по-моему copy и pos все-таки проще, не?
xrob вне форума Ответить с цитированием
Старый 17.03.2012, 01:47   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

xrob, на самом деле нет. Регулярное выражение - это куда лучше и быстрее святой троицы Copy,Pos,Delete, но нужно головой думать над его составлением.

И модераторы сейчас тебя заклюют за поднятие темы 3-х летней давности.
Человек_Борща вне форума Ответить с цитированием
Старый 17.03.2012, 11:46   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
и быстрее святой троицы Copy,Pos,Delete
1)капитально сомневаюсь насчет быстрее.
2)Delete не входит в святую троицу.(там PosEx)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.03.2012, 23:40   #10
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

ой, простите
че-то не заметил дату темы
как я вообще здесь оказался?
наверное гуглил RegExpr, после обсуждения виртуализации, ага!

ну раз уж я здесь, вопрос:
как заюзать регулярные выражения в Delphi ?
xrob вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
правильно составить регулярное выражение. мимо Общие вопросы Delphi 0 04.07.2009 10:15
Парсим bash.org.ru Merkator Работа с сетью в Delphi 1 21.04.2009 21:21
Создать выражение для запроса с условием smoky Microsoft Office Access 3 13.05.2008 21:39
Помогите составить рег.выражение Adamant PHP 15 31.12.2007 11:16