delphi - uso - ¿Cómo dividir la secuencia por un delimitador de caracteres múltiples?
string split c# (5)
Hay otra solución bastante simple usando TStringList. Cambiar 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;
¿Hay una función Delphi para dividir la cadena por un delimitador de múltiples caracteres en lugar de un solo carácter?
Por ejemplo, cuando usaría esa función de esta manera:
SplitString(''Whale<->Mammal<->Ocean'', ''<->'')
Me gustaría obtener un resultado de estas 3 cadenas:
''Whale'', ''Mammal'', ''Ocean''
¿Hay alguna función en Delphi para esto?
No existe tal función ''desde la caja''. Si sus cadenas contienen texto regular, puede utilizar StringReplace con un símbolo exótico; de lo contrario, no es difícil escribir su propia función dividida usando Pos o IdStrings.SplitString (si está disponible en D2010)
function SplitStringByStr(const S, StrDelimiter: string): TStringDynArray;
var
tmp: string;
begin
tmp := StringReplace(S, StrDelimiter, ''`'', [rfReplaceAll]);
Result := SplitString(tmp, ''`'');
end;
No sé si Delphi tiene un procedimiento de división estándar que utiliza una cadena como delimitador. Pero puede escribir el suyo ya sea que tenga o no:
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;
Espero eso ayude..
Puede consultar mi unidad StringUtils.pas que es parte de la Biblioteca Cromis
Hay un tokenizador de texto simple allí. Pero probablemente es justo lo que necesitas. La interfaz es así
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;
Soporta cadenas como delimitadores y también más de un delimitador.
Si tiene JCL instalado, entonces en la unidad jclStrings
hay StrToStrings
procedimiento StrToStrings
:
var sl: TStringList;
begin
sl := TStringList.Create;
StrToStrings(''Whale<->Mammal<->Ocean'' , ''<->'' , sl);