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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TRegExpr, определить количество вхождений 
V
    Опции темы
Poseidon
Дата 26.11.2012, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


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

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



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

// в Text наш текст, в Cnt нужное нам количество вхождений
  Cnt:= 0;
  RegExpr:= TRegExpr.Create;
  try
    RegExpr.Expression:= 'блабла';
    if RegExpr.Exec(Text) then 
      repeat 
        Inc(Cnt); 
      until not RegExpr.ExecNext;
  finally
    RegExpr.Free;
  end;
 Все работает и правильно считает, но долго, если вхождений много. Так вот, есть ли в TRegExpr какой-нибудь метод, который позволит получить количество вхождений без полного перебора?


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


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



А что TRegExpr?

Добавлено через 6 минут и 26 секунд
Может там там есть что типа matchCount?\

Добавлено через 7 минут и 23 секунды
Цитата(Poseidon @  26.11.2012,  10:13 Найти цитируемый пост)
Все работает и правильно считает, но долго, если вхождений много.

Может выражение нужно подправить?
PM MAIL   Вверх
Poseidon
Дата 26.11.2012, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


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

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



Akella, вопрос твой я не понял. Понятно что код не весь, но, думаю, по нему понятно как и что сделано.


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

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



Poseidon, ну посмотри какие у него методы есть в которых есть слово count.
PM MAIL   Вверх
Akella
Дата 26.11.2012, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



Цитата(Poseidon @  26.11.2012,  21:34 Найти цитируемый пост)
Akella, вопрос твой я не понял.

Что за библиотека? DiRegExp, RegExprStudio, встроенная в дельфи библиотека есть.
Их вон сколько бывает: http://forum.vingrad.ru/forum/topic-258533.html
PM MAIL   Вверх
Poseidon
Дата 26.11.2012, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


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

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



Цитата(Akella @  26.11.2012,  23:08 Найти цитируемый пост)
Их вон сколько бывает: http://forum.vingrad.ru/forum/topic-258533.html
Ох тыж я древний smile Не, обычная Студия

Цитата(Akella @  26.11.2012,  23:08 Найти цитируемый пост)
встроенная в дельфи библиотека есть.
  smile 

Ладно, раз пошла такая пляска, в какой библиотеке есть подобное?



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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

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



Цитата(Poseidon @  26.11.2012,  23:39 Найти цитируемый пост)
Ох тыж я древний smile Не, обычная Студия

Ну а в этой "студии" не удосужился посмотреть и попробовать "методы есть в которых есть слово count"?


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Poseidon
Дата 27.11.2012, 08:38 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


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

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



northener, а прежде чем писать, сам не удосужился глянуть? Это было сделано первым делом.


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


Эксперт
****


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

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



Цитата(Akella @  26.11.2012,  23:08 Найти цитируемый пост)
встроенная в дельфи библиотека есть
с ней не совсем всё в порядке в области внутренней конвертации из utf16 в utf8 или обратно



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Akella
Дата 28.11.2012, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



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

Poseidon, можешь сам проверить.
Вот ссылка на exe-шник
http://rghost.ru/private/41859976/6669e8e2...e1bc551e28b9ab5
в верхнее окошко вставляешь текст, в нижнее - выражение. Нажимаешь кнопку Match x1, а затем Count. Справа внизу, в строке статуса увидишь Execution time  ..., ms

Добавлено через 6 минут и 54 секунды
Poseidon, но количество тоже вычисляется примерно так, как ты: 

Код

procedure TfrmDIRegExWorkbench.btnCountClick(Sender: TObject);
var
  c: Cardinal;
  t1, t2: Cardinal;
begin
  if not Matching then
    begin
      Matching := True;

      btnMatch.Enabled := False;
      btnMatch.Enabled := False;
      btnMatchNext.Enabled := False;
      btnMatchMultiple.Enabled := False;
      btnCount.Caption := 'Cancel';

      try
        PrepareRegEx;

        c := 0;
        t1 := GetTickCount;
        if FWorkRegEx.Match(StartOffset) >= 0 then
          begin
            t2 := GetTickCount;
            DisplayResult(t2 - t1, 1);



            repeat
              Inc(c);// количество
              if c mod 100 = 0 then Application.ProcessMessages;
            until not Matching or not (FWorkRegEx.MatchNext >= 0);




          end;
        t2 := GetTickCount;

        Status('Count: ' + IntToStr(c), t2 - t1, c);
      finally
        btnMatch.Enabled := True;
        btnMatchNext.Enabled := FWorkRegEx.SubStrCount >= 0;
        btnMatchMultiple.Enabled := True;
        btnCount.Caption := '&Count';
        Matching := False;
      end;
    end
  else
    Matching := False;
end;


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


Delphi developer
****


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

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



Дело в том, что у меня порядка 4000 статей, каждая в среднем по 5 Кб чистого текста. Так вот мало того что приходится циклом поднимать каждую статью, так еще и в цикле считать вхождения. Вот я и подумал, что возможно можно как-то реализовать подсчет без цикла. Ну да ладно, я поднимаю приоритет циклов до Highest и получаю в среднем до 3х секунд на подсчет. Не критично.


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
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.0856 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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