В этом простеньком проекте необходим только код для обработки нажатия кнопки 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 для регулярного выражения.
Думаю, что выкладывать исходник — нет смысла. Кому что непонятно — спрашивайте в комментариях.
Здраствуйте Masha. Вопрос по вышенаписанному коду. Вот строка: "memOutput.Lines.Add(Format('SubMatch[%d] = "%s"', [j, VarToStr(sm[j])]));" Выводит строку в определённом формате, а мне надо чтобы выводит исключительно "%s". Есди просто удалить все параметры кроме "%s", то программа выдаёт ошибку: "Format "%s" invalid or incompatible with argument". Не подскажите что сделать чтобы выводилось только "%s"?? Зарание спасибо.
ОтветитьУдалитьА в списке аргументов удалил j? Количество аргументов в списке должно соответствовать тому, что испольуется в формате. О Format-е можно почитать в хелпе))
ОтветитьУдалитьmemOutput.Lines.Add(Format('%s', [VarToStr(sm[j])]));
Хотя не понимаю, зачем вообще использовать формат, если надо простую строку выводить?
memOutput.Lines.Add(VarToStr(sm[j]));
Спасибо ;) Просто сразу что-то не догнал, а теперь всё понятно :) Бывает такое.
ОтветитьУдалитьПопробовал как написано - все получилось. Спасибо.
ОтветитьУдалитьДа не за что :)
ОтветитьУдалитьУ меня нет класса TRegExp при импортировании библиотеки типов. Но есть просто RegExp. Хотелось бы потестировать исходник, потому что у меня этот пример в Delphi 2010 работает не совсем корректно. Почему-то подвхождения не находятся, а основной результат дублируется.
ОтветитьУдалить