вы можете использовать свойство TStrings.DelimitedText для разделения строки
проверьте этот образец
StrictDelimiter
ОБНОВИТЬ
См. Эту ссылку для объяснения Classes.ExtractStrings
.
Я пытаюсь найти функцию 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,
Нет необходимости в разработке 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'
Вы можете использовать StrUtils.SplitString
.
function SplitString(const S, Delimiters: string): TStringDynArray;
Его описание из документации :
Разделяет строку на разные части, ограниченные указанными символами разделителя.
SplitString разделяет строку на разные части, разделенные указанными символами разделителя. S - это строка, которую нужно разбить. Разделители - это строка, содержащая символы, определенные как разделители.
SplitString возвращает массив строк типа System.Types.TStringDynArray, который содержит разделенные части исходной строки.
Используя функцию SysUtils.TStringHelper.Split , введенную в Delphi XE3:
var
MyString: String;
Splitted: TArray<String>;
begin
MyString := 'word:doc,txt,docx';
Splitted := MyString.Split([':']);
end.
Это разделит строку с заданным разделителем на массив строк.
Подобно функции 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;
Отличия:
Примеры:
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% разделительных строк, что дает массив пустых элементов!)