Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск значение в тексте 
:(
    Опции темы
Madnes
Дата 18.6.2015, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 18.6.2015

Репутация: нет
Всего: нет



Добрый день.
Есть текст
Цитата

<font color="#000000">11.06.15 23:16</font>Антарес получил 1 вар-поинт(а/ов) в войне против Wartest за убийство _geksa_ в бою 284879281335737.
<font color="#000000">11.06.15 23:25</font>viktor2005 отдал 1 вар-поинт(а/ов) в войне против Wartest за убийство ulnest в бою 284879297545601.
<font color="#000000">11.06.15 23:25</font>NoTrest получил 1 вар-поинт(а/ов) в войне против Wartest за убийство Golds love me в бою 284879754139073.
<font color="#000000">11.06.15 23:41</font>Вильнус отдал 1 вар-поинт(а/ов) рейтинга в войне против Wartest погибнув от руки Аннет в бою 28283854608705.

Из него я выбираю ники (Антарес, viktor2005, NoTrest, Вильнус), слова "Получил", "Отдал", кол-во.
Все это дело заполняю в ListView в виде:

 Ник            Получил            Отдал
Антарес            1
viktor2005                              1
NoTrest             1
Вильнус                                  1

Код прилагаю:
Код

var
  str: TStringList;
  i, j, r1, r0: Integer;
  s, n: string;
  b: Integer;
  li: TlistItem;
begin
    for j := 0 to 1000 do
    begin
      mas[j].nik := '';
      mas[j].r0 := 0;
      mas[j].r1 := 0;
    end;
    str := TStringList.Create;
    str.Text := Interface.Get('History', '');
    str.Text := Replace(str.Text, '<font color="#000000">',#13 + '<font color="#000000">');
    str.Delete(0);

    for i := 0 to str.Count - 1 do
    begin
      sMemo1.Lines.Add(str[i]);
      s := str.Strings[i];

      if Pos('получил', s) > 0 then
      begin
        n := Copy(s, Pos('</font>', s) + 7, Pos('получил', s) - Pos('</font>', s) - 8);
        b := 1000;
        for j := 0 to 1000 do
        begin
          if mas[j].nik = n then
            b := Min(j, b);

          if mas[j].nik = '' then
            b := Min(j, b);
        end;
        mas[b].nik := n;
        mas[b].r0 := mas[b].r0 + 1;
      end;

      if Pos('отдал', s) > 0 then
         begin
           n := Copy(s, Pos('</font>', s) + 7, Pos('отдал', s) - Pos('</font>', s)- 8);

        b := 1000;
        for j := 0 to 1000 do
        begin
          if mas[j].nik = n then
            b := Min(j, b);
          if mas[j].nik = '' then
            b := Min(j, b);
        end;
        mas[b].nik := n;
        mas[b].r1 := mas[b].r1 + 1;
      end;
  end;
    sListView1.Clear;
    for i := 0 to 1000 do
      if mas[i].nik <> '' then
      Begin
        li := sListView1.Items.Add;
        li.Caption := mas[i].nik;
        li.SubItems.Add(IntToStr(mas[i].r0));
        r0 := r0 + mas[i].r0;
        li.SubItems.Add(IntToStr(mas[i].r1));
        r1 := r1 + mas[i].r1;
      End;
    sLabel1.Caption := 'счет ' + IntToStr(r0) + '/' + IntToStr(r1);
end;
end;


Все работало замечательно, пока не поменялось логирование в тексте. В логах появились "пункт(а) рейтинга" и "вар-поинт(а/ов)" давалось только целое числа, а сейчас может и десятичное быть. Вот такой вобщем вид стал:

Цитата

<font color="#000000">11.06.15 23:16</font>Антарес получил 1 вар-поинт(а/ов) в войне против Wartest за убийство _geksa_ в бою 284879281335737.
<font color="#000000">11.06.15 23:25</font>viktor2005 отдал 0.8 вар-поинт(а/ов) в войне против Wartest за убийство ulnest в бою 284879297545601.
<font color="#000000">11.06.15 23:25</font>NoTrest получил 1.2 вар-поинт(а/ов) в войне против Wartest за убийство Golds love me в бою 284879754139073.
<font color="#000000">11.06.15 23:22</font>viktor2005 отдал 1 пункт(а) рейтинга в войне против Wartest за убийство _geksa_ в бою 284879281345737.
<font color="#000000">11.06.15 23:41</font>Вильнус отдал 0.3 вар-поинт(а/ов) рейтинга в войне против Wartest погибнув от руки Аннет в бою 28283854608705.
<font color="#000000">11.06.15 23:41</font>Noте получил 0.7 пункт(а) рейтинга в войне против Wartest за убийство Вариса в бою 28284915136075.


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


PM MAIL   Вверх
Poseidon
Дата 18.6.2015, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Данную задачу лучше всего решать через регулярные выражения. Само выражение будет примерно таким:
Цитата
</font>(.*?)\s(получил\s(.*?)\s.*?|отдал\s(.*?)\s.*?)


Ник будет в групперовке 1. 
Значение "Получил" - в групперовке 3.
Значение "Отдал" - в групперовке 4.


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Madnes
Дата 18.6.2015, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 18.6.2015

Репутация: нет
Всего: нет



Никогда не имел дело с регулярками :-(

Не подскажите рабочим кодом ?
PM MAIL   Вверх
Poseidon
Дата 18.6.2015, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Цитата(Madnes @  18.6.2015,  12:40 Найти цитируемый пост)
Никогда не имел дело с регулярками

Вот тут все хорошо описано.

Не знаю какая у Вас версия Delphi. Регулярки появились, вроде бы, в XE3. Если у Вас что-то более раннее, то надо будет использовать сторонние библиотеки с небольшими правками кода. Код проверен на XE7.

Код

{...}
uses 
  {...} System.RegularExpressions;

{...}

type
  TInformation = record
    Name,             // Ник
    PointIn,          // Получил
    PointOut: string; // Отдал
  end;

{...}

function GetInformation(const HTML: string): TArray<TInformation>;
const
  Pattern = '</font>(.*?)\s(получил\s(.*?)\s.*?|отдал\s(.*?)\s.*?)';
var
  Match: TMatch;
  MatchCol: TMatchCollection;
  i: Integer;
begin
  if TRegEx.IsMatch(HTML, Pattern) then
    begin
      MatchCol := TRegEx.Matches(HTML, Pattern);
      SetLength(Result, MatchCol.Count);

      for i := 0 to MatchCol.Count - 1 do
        begin
          Match := MatchCol.Item[i];

          Result[i].Name := Match.Groups[1].Value;
          Result[i].PointIn := Match.Groups[3].Value;

          if Match.Groups.Count = 5  then
            Result[i].PointOut := Match.Groups[4].Value
          else
            Result[i].PointOut := string.Empty;
        end;
    end;
end;


Скармливаешь функции свой html, на выходе получаешь динамический массив записей TInformation. Заполнение TListView уже как-нибудь сам smile

Это сообщение отредактировал(а) Poseidon - 18.6.2015, 14:14


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0773 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.