Wycinanie tekstu ze stringa lub memo

0

Siema. Chciałbym z łańcucha

jeden dwa trzy kot słowo pies pięć sześć siedem

wyciąć "słowo" do zmiennej.

Problem w tym że "słowo" w tym łańcuchu może być za każdym razem innym słowem. Kot i pies zawsze pozostaną bez zmian więc mogę się do nimi posłużyć.
Reszta przed kotem i za psem podobnie jak "słowo" zawsze będzie miało inną wartość.

Jak wyciąć tekst znajdujący się między dwoma słowami? Jaka funkcja tutaj jest najlepsza?

0

Obczaj Copy, Pos i ExtractStrings.

1

Można tak, jak TomRiddle radzi. Jednak najprościej jeżeli słowa będzie oddzielać ten sam separator i chodzi o wyodrębnienie piątek słowa z ciągu, to ja bym zrobil to w ten sposób co poniżej.

function Explode(Str : string; Separator : string) : TStringList;
var
  X : integer;
begin
  Result := TStringList.Create;
  X := Pos(Separator, Str);
  while X > 0 do
  begin
    Result.Add(Copy(Str, 1, X - 1));
    if X <= Length(Str) then
    begin
      Str := Copy(Str, X + Length(Separator), Length(Str));
    end;
    X := Pos(Separator, Str);
  end;
  if (Length(Str) > 0) then
  begin
    Result.Add(Str);
  end;
end;

Przykład użycia:

var
  SL : TStringList;
begin
  SL := Explode('jeden dwa trzy kot słowo pies pięć sześć siedem', ' ');
  ShowMessage(SL[4]);
  SL.Free;
end;

A jak tekst się bardziej różni to do takich celów jak wyodrębnienie tekstu z innego tekstu najlepiej skorzystać z wyrażeń regularnych. Polecam moduł z http://regexpstudio.com - są dołaczone przykłady oraz dokumentacja, a na google znajdziesz mnóstwo innych przykładów, jak i dodatkowych informacji.

0
olesio napisał(a)

Można tak, jak TomRiddle radzi. Jednak najprościej jeżeli słowa będzie oddzielać ten sam separator i chodzi o wyodrębnienie piątek słowa z ciągu, to ja bym zrobil to w ten sposób co poniżej.

function Explode(Str : string; Separator : string) : TStringList;
var
  X : integer;
begin
  Result := TStringList.Create;
  X := Pos(Separator, Str);
  while X > 0 do
  begin
    Result.Add(Copy(Str, 1, X - 1));
    if X <= Length(Str) then
    begin
      Str := Copy(Str, X + Length(Separator), Length(Str));
    end;
    X := Pos(Separator, Str);
  end;
  if (Length(Str) > 0) then
  begin
    Result.Add(Str);
  end;
end;

Przykład użycia:

var
  SL : TStringList;
begin
  SL := Explode('jeden dwa trzy kot słowo pies pięć sześć siedem', ' ');
  ShowMessage(SL[4]);
  SL.Free;
end;

A jak tekst się bardziej różni to do takich celów jak wyodrębnienie tekstu z innego tekstu najlepiej skorzystać z wyrażeń regularnych. Polecam moduł z http://regexpstudio.com - są dołaczone przykłady oraz dokumentacja, a na google znajdziesz mnóstwo innych przykładów, jak i dodatkowych informacji.

Dzięki, ale niestety tak to nie może działać bo łańcuch przed kotem i za psem zawsze może być inny jak już mówiłem, raz może mieć 10 znaków a raz 1000 więc nie mogę sobie tak wyliczać i wybierać słowo po liczbie. Kot i pies muszą być separatorami.

0

Znajdujesz gdzie jest "kot" przez Pos a potem gdzie jest "pies" przez PosEx i potem Copy.

0
qwerty napisał(a)

Znajdujesz gdzie jest "kot" przez Pos a potem gdzie jest "pies" przez PosEx i potem Copy.

Tak działa, idealnie, dzieki

1 użytkowników online, w tym zalogowanych: 0, gości: 1