Как разделить строку на многосимвольный разделитель? - программирование
Подтвердить что ты не робот

Как разделить строку на многосимвольный разделитель?

Есть ли функция Delphi для разделения строки на многосимвольный разделитель, а не на один символ?

Например, когда я буду использовать эту функцию следующим образом:

SplitString('Whale<->Mammal<->Ocean', '<->')

Я получаю результат этих трех строк:

'Whale', 'Mammal', 'Ocean'

Есть ли такая функция в Delphi для этого?

4b9b3361

Ответ 1

Существует еще одно довольно простое решение, использующее TStringList. Измените LineBreak:

procedure TForm208.Button1Click(Sender: TObject);
var
  lst: TStringList;
begin
  lst := TStringList.Create;
  try
    lst.LineBreak := '<->';
    lst.Text := 'Whale<->Mammal<->Ocean';
    Memo1.Lines := lst;
  finally
    lst.Free;
  end;
end;

Ответ 2

Вы можете проверить мой блок StringUtils.pas, который является частью библиотеки Cromis

Там есть простой текстовый токенизатор. Но, вероятно, это именно то, что вам нужно. Интерфейс подобен этому

TTextTokenizer = class
  private
    FTokens: TTokens;
    FDelimiters: array of ustring;
  public
    constructor Create;
    procedure Tokenize(const Text: ustring);
    procedure AddDelimiters(const Delimiters: array of ustring);
    property Tokens: TTokens read FTokens;
  end;

Поддерживает строки как разделители, а также более одного разделителя.

Ответ 3

Если у вас есть JCL, то в модуле jclStrings есть процедура StrToStrings:

var sl: TStringList;
begin
  sl := TStringList.Create;
  StrToStrings('Whale<->Mammal<->Ocean' , '<->' , sl);

Ответ 4

Нет такой функции "из окна". Если ваши строки содержат обычный "хороший" текст, вы можете использовать StringReplace с экзотическим символом, иначе нетрудно написать собственную функцию разделения с помощью Pos или IdStrings.SplitString(если она доступна в D2010)

function SplitStringByStr(const S, StrDelimiter: string): TStringDynArray;
var
  tmp: string;
begin
  tmp := StringReplace(S, StrDelimiter, '`', [rfReplaceAll]);
  Result := SplitString(tmp, '`');
end;

Ответ 5

Я не знаю, имеет ли Delphi стандартную процедуру разделения, которая использует строку в качестве разделителя. Но вы можете написать свой собственный либо он есть, либо нет:

procedure SplitStr(const Source, Delimiter: String; var DelimitedList: TStringList);
var
  s: PChar;

  DelimiterIndex: Integer;
  Item: String;
begin
  s:=PChar(Source);

  repeat
    DelimiterIndex:=Pos(Delimiter, s);
    if DelimiterIndex=0 then Break;

    Item:=Copy(s, 1, DelimiterIndex-1);

    DelimitedList.Add(Item);

    inc(s, DelimiterIndex + Length(Delimiter)-1);
  until DelimiterIndex = 0;
  DelimitedList.Add(s);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  sl: TStringList;
begin
  sl:=TStringList.Create;
  SplitStr('delphi++split++string++','++',sl);
  //do something with the list
  sl.Free;
end;

Надеюсь, что это поможет.