Поиск по блогу

понедельник, 25 августа 2008 г.

Создание собственного редактора для проверки составляемых регулярных выражений

Как я уже писала, после составления регулярных выражений "по теории", их необходимо проверить с использованием того инструмента, которым они потом будут использоваться. Мы работаем с объектом RegExp в Delphi (надеюсь, все уже познакомились с библиотекой хотя бы просто прочитав статью, ссылку на которую я привела в предыдущем посте). Перейдем от теории к практике. Создадим простенький инструмент, позволяющий искать выражения, удовлетворяющие паттерну. На форме будет memo для исходного текста, memo для вывода результатов, edit для ввода регулярного выражения и кнопка "Find".


В этом простеньком проекте необходим только код для обработки нажатия кнопки Find. Он будет следующим:

procedure TForm1.Button2Click(Sender: TObject);
var
R: TRegExp;
mc: MatchCollection;
m: Match;
sm: SubMatches;
i, j: Integer;
begin
memOutput.Clear;
R := TRegExp.Create(Self);
try
R.Pattern := edtRegExpFind.Text;
R.IgnoreCase := cbIGNCASE.Checked;
R.Global := cbGLOBAL.Checked;
R.Multiline:=CBMULTILINE.Checked;
mc := R.Execute(memInput.Lines.Text) as MatchCollection;
if mc.Count > 0 then begin
for i := 0 to mc.Count - 1 do begin
m := mc[i] as Match;
memOutput.lines.Add(intToStr(i)+'.');
MemOutput.Lines.Add(Format('Match[%d] = "%s"', [i, m.Value]));
sm := m.SubMatches as SubMatches;
for j := 0 to sm.Count - 1 do
memOutput.Lines.Add(Format(' SubMatch[%d] = "%s"', [j, VarToStr(sm[j])]));
end;
end;
finally
m := nil;
sm := nil;
mc := nil;
R.Free;
end;
end;


cbIGNCASE, cbGLOBAL, CBMULTILINE — чекбоксы соответственно определяющие свойства IgnoreCase, Global и Multiline для регулярного выражения.

Думаю, что выкладывать исходник — нет смысла. Кому что непонятно — спрашивайте в комментариях.

Статьи схожей тематики:



6 комментариев:

  1. Здраствуйте Masha. Вопрос по вышенаписанному коду. Вот строка: "memOutput.Lines.Add(Format('SubMatch[%d] = "%s"', [j, VarToStr(sm[j])]));" Выводит строку в определённом формате, а мне надо чтобы выводит исключительно "%s". Есди просто удалить все параметры кроме "%s", то программа выдаёт ошибку: "Format "%s" invalid or incompatible with argument". Не подскажите что сделать чтобы выводилось только "%s"?? Зарание спасибо.

    ОтветитьУдалить
  2. А в списке аргументов удалил j? Количество аргументов в списке должно соответствовать тому, что испольуется в формате. О Format-е можно почитать в хелпе))

    memOutput.Lines.Add(Format('%s', [VarToStr(sm[j])]));

    Хотя не понимаю, зачем вообще использовать формат, если надо простую строку выводить?

    memOutput.Lines.Add(VarToStr(sm[j]));

    ОтветитьУдалить
  3. Спасибо ;) Просто сразу что-то не догнал, а теперь всё понятно :) Бывает такое.

    ОтветитьУдалить
  4. Попробовал как написано - все получилось. Спасибо.

    ОтветитьУдалить
  5. У меня нет класса TRegExp при импортировании библиотеки типов. Но есть просто RegExp. Хотелось бы потестировать исходник, потому что у меня этот пример в Delphi 2010 работает не совсем корректно. Почему-то подвхождения не находятся, а основной результат дублируется.

    ОтветитьУдалить

Комментарии модерируются, вопросы не по теме удаляются, троллинг тоже.

К сожалению, у меня нет столько свободного времени, чтобы отвечать на все частные вопросы, так что, может, свой вопрос лучше задать на каком-нибудь форуме?

Поделиться