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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2010, 16:45   #1
zver777
Пользователь
 
Регистрация: 31.07.2009
Сообщений: 89
По умолчанию Проблема с TRegExpr

При использовании регулярных выражений(TRegExpr) возникает такая ошибка


Использую вот такой код
Код:
if RegExpr1.Exec(s) then
         begin
           repeat
            s:=regexpr1.Replace(s,regexpr1.Match[1]);
           until not regexpr1.ExecNext;
         end;
Подскажите, что это значит и чем она вызвана.

Последний раз редактировалось zver777; 06.05.2010 в 16:50.
zver777 вне форума Ответить с цитированием
Старый 07.05.2010, 07:39   #2
Greek9000
Форумчанин
 
Регистрация: 01.09.2009
Сообщений: 151
По умолчанию

Есть предположение, что выходите за размерность массива.
вместо
s:=regexpr1.Replace(s,regexpr1.Matc h[1]);
попробуйте
s:=regexpr1.Replace(s,regexpr1.Matc h[0]);
Greek9000 вне форума Ответить с цитированием
Старый 07.05.2010, 14:27   #3
zver777
Пользователь
 
Регистрация: 31.07.2009
Сообщений: 89
По умолчанию

Если использовать regexpr1.Match[0], то получится, что будет текст заменяться на тот же текст.

Мне же надо из строки вида
<blabla>text<blabla> при использовании реглуярки <blabla>(.*?)</blabla>
заменить на text.
zver777 вне форума Ответить с цитированием
Старый 11.05.2010, 07:00   #4
Greek9000
Форумчанин
 
Регистрация: 01.09.2009
Сообщений: 151
По умолчанию

Прошу прощения. Действительно сморозил глупость.

Ваша проблема возникает из-за того, что внутри ф-ции Replace происходит вызов ExecNext. Из-за этого происходит повторный вызов этой самой ExecNext уже в Вашем коде, который и приводит к возникновению исключения.

Вот пример рабочего кода, которым подсвечиваются ключевые слова:

Код:
//...
    dlt := 0;
    r.Expression := sexp;
    if r.Exec(InActiveTags) then begin
      repeat
        smch := '<color = 255><b>'+r.Match[0]+'</b></color>';
        mp := r.MatchPos[0];
        ml := r.MatchLen[0];
        Delete(srs, mp+dlt, ml);
        Insert(smch, srs, mp+dlt);
        dlt := dlt + (Length(smch)-Length(r.Match[0]));
      until not r.ExecNext;
    end;
  finally
    r.Free;
  end;
  Result := srs;
Т.о. здесь замена производится вручную по всем найденным совпадениям.
Если не хочется делать этого вручную, то - как мне кажется - придётся использовать два экземпляра TRegExp-а. Первый для того, что бы найти все совпадения, второй - что бы производить замены.
Есть ещё вариант первым шагом построить список необходимых замен, после чего в цикле вызвать Replace для каждого элемента полученного списка.
Greek9000 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с рамами/Проблема с ЖД DRAGGER Компьютерное железо 6 04.01.2009 23:37