Разделить строку на массив строк на основе разделителя

Я пытаюсь найти функцию Delphi, которая будет вводить строку «word: doc, txt, docx» в массив строк на основе разделителя. Я много нашел в Google, но у всех, похоже, есть свои проблемы, и я не смог заставить их работать.

Мне просто нужно разбить строку как: ['word', 'doc,txt,docx']на массив на основе::. Результат будет .program Project28; {$APPTYPE CONSOLE} uses Classes, SysUtils; procedure Split(Delimiter: Char; Str: string; ListOfStrings: TStrings) ; begin ListOfStrings.Clear; ListOfStrings.Delimiter := Delimiter; ListOfStrings.StrictDelimiter := True; // Requires D2006 or newer. ListOfStrings.DelimitedText := Str; end; var OutPutList: TStringList; begin OutPutList := TStringList.Create; try Split(':', 'word:doc,txt,docx', OutPutList) ; Writeln(OutPutList.Text); Readln; finally OutPutList.Free; end; end.

Кто-нибудь имеет функцию, которую они знают, работает?

спасибо

delphi,string,split,delimiter,

72

Ответов: 17


76 принят

вы можете использовать свойство TStrings.DelimitedText для разделения строки

проверьте этот образец

StrictDelimiter

ОБНОВИТЬ

См. Эту ссылку для объяснения Classes.ExtractStrings.


57 ов

Нет необходимости в разработке Splitфункции. Он уже существует, см .: программа Project1 ; {$ APPTYPE CONSOLE} использует классы ; var List : TStrings ; begin List : = TStringList . Создать ; попробуйте ExtractStrings ([ ':' ], [], PChar ( 'word: doc, txt, docx' ), List ); WriteLn ( List . Text ); ReadLn ; наконец, список . Бесплатно ; конец ; конец . "rel =" noreferrer "> Classes.ExtractStrings .

Используйте его следующим образом:

List

И ответить на вопрос полностью; Listпредставляет желаемый массив с элементами:

List[0] = 'word'
List[1] = 'doc,txt,docx'

34

Вы можете использовать StrUtils.SplitString.

function SplitString(const S, Delimiters: string): TStringDynArray;

Его описание из документации :

Разделяет строку на разные части, ограниченные указанными символами разделителя.

SplitString разделяет строку на разные части, разделенные указанными символами разделителя. S - это строка, которую нужно разбить. Разделители - это строка, содержащая символы, определенные как разделители.

SplitString возвращает массив строк типа System.Types.TStringDynArray, который содержит разделенные части исходной строки.


29 ов

Используя функцию SysUtils.TStringHelper.Split , введенную в Delphi XE3:

var
  MyString: String;
  Splitted: TArray<String>;
begin
  MyString := 'word:doc,txt,docx';
  Splitted := MyString.Split([':']);
end.

Это разделит строку с заданным разделителем на массив строк.


12 ов

Подобно функции Explode (), предлагаемой Mef, но с несколькими отличиями (один из которых я считаю исправлением ошибки):

  type
    TArrayOfString = array of String;


  function SplitString(const aSeparator, aString: String; aMax: Integer = 0): TArrayOfString;
  var
    i, strt, cnt: Integer;
    sepLen: Integer;

    procedure AddString(aEnd: Integer = -1);
    var
      endPos: Integer;
    begin
      if (aEnd = -1) then
        endPos := i
      else
        endPos := aEnd + 1;

      if (strt < endPos) then
        result[cnt] := Copy(aString, strt, endPos - strt)
      else
        result[cnt] := '';

      Inc(cnt);
    end;

  begin
    if (aString = '') or (aMax < 0) then
    begin
      SetLength(result, 0);
      EXIT;
    end;

    if (aSeparator = '') then
    begin
      SetLength(result, 1);
      result[0] := aString;
      EXIT;
    end;

    sepLen := Length(aSeparator);
    SetLength(result, (Length(aString) div sepLen) + 1);

    i     := 1;
    strt  := i;
    cnt   := 0;
    while (i <= (Length(aString)- sepLen + 1)) do
    begin
      if (aString[i] = aSeparator[1]) then
        if (Copy(aString, i, sepLen) = aSeparator) then
        begin
          AddString;

          if (cnt = aMax) then
          begin
            SetLength(result, cnt);
            EXIT;
          end;

          Inc(i, sepLen - 1);
          strt := i + 1;
        end;

      Inc(i);
    end;

    AddString(Length(aString));

    SetLength(result, cnt);
  end;

Отличия:

  1. Параметр aMax ограничивает количество возвращаемых строк
  2. Если входная строка заканчивается разделителем, то считается, что существует номинальная «пустая» конечная строка

Примеры:

SplitString(':', 'abc') returns      :    result[0]  = abc

SplitString(':', 'a:b:c:') returns   :    result[0]  = a
                                          result[1]  = b
                                          result[2]  = c
                                          result[3]  = <empty string>

SplitString(':', 'a:b:c:', 2) returns:    result[0]  = a
                                          result[1]  = b

Это конечный разделитель и условный «пустой конечный элемент», который я считаю исправлением ошибки.

Я также включил изменение распределения памяти, которое я предложил, с уточнением (я ошибочно предположил, что входная строка может содержать 50% разделителей, но вполне возможно, что она состоит из 100% разделительных строк, что дает массив пустых элементов!)

Дельфы, строка, разъемные, разделитель,
Похожие вопросы