Chức năng này được thiết kế để không hợp nhất các dấu phân tách liên tiếp. Ví dụ: xem xét tách chuỗi sau trên dấu phẩy:
foo,,bar
Bạn mong đợi gì SplitString('foo,,bar', ',')
để trả lại? Bạn có đang tìm kiếm ('foo', 'bar')
hoặc câu trả lời là ('foo', '', 'bar')
? Nó không phải là một ưu tiên mà là đúng, và các trường hợp sử dụng khác nhau có thể muốn đầu ra khác nhau.
Nếu trường hợp của bạn, bạn chỉ định hai dấu phân cách, ';'
và ' '
. Điều này có nghĩa rằng
'a'; 'b'
chia rẽ tại ';'
và một lần nữa tại ' '
. Giữa hai dấu phân cách đó không có gì, và do đó một chuỗi rỗng được trả về ở giữa 'a'
và 'b'
.
Phương pháp Split
từ string helper được giới thiệu trong XE3 có thông số TStringSplitOptions
. Nếu bạn vượt qua ExcludeEmpty
cho thông số đó thì các dấu phân cách liên tiếp được coi là một dấu tách đơn. Chương trình này:
{$APPTYPE CONSOLE}
uses
System.SysUtils;
var
S: string;
begin
for S in '''a''; ''b''; ''c'''.Split([';', ' '], ExcludeEmpty) do begin
Writeln(S);
end;
end.
kết quả đầu ra:
'a'
'b'
'c'
Nhưng bạn không có điều này có sẵn cho bạn trong XE2 vì vậy tôi nghĩ rằng bạn sẽ phải cuộn chức năng phân chia của riêng bạn. Điều này có thể trông giống như sau:
function IsSeparator(const C: Char; const Separators: string): Boolean;
var
sep: Char;
begin
for sep in Separators do begin
if sep=C then begin
Result := True;
exit;
end;
end;
Result := False;
end;
function Split(const Str, Separators: string): TArray<string>;
var
CharIndex, ItemIndex: Integer;
len: Integer;
SeparatorCount: Integer;
Start: Integer;
begin
len := Length(Str);
if len=0 then begin
Result := nil;
exit;
end;
SeparatorCount := 0;
for CharIndex := 1 to len do begin
if IsSeparator(Str[CharIndex], Separators) then begin
inc(SeparatorCount);
end;
end;
SetLength(Result, SeparatorCount+1); // potentially an over-allocation
ItemIndex := 0;
Start := 1;
CharIndex := 1;
for CharIndex := 1 to len do begin
if IsSeparator(Str[CharIndex], Separators) then begin
if CharIndex>Start then begin
Result[ItemIndex] := Copy(Str, Start, CharIndex-Start);
inc(ItemIndex);
end;
Start := CharIndex+1;
end;
end;
if len>Start then begin
Result[ItemIndex] := Copy(Str, Start, len-Start+1);
inc(ItemIndex);
end;
SetLength(Result, ItemIndex);
end;
Tất nhiên điều này giả định rằng bạn muốn một khoảng trống hoạt động như một dấu tách. Bạn đã yêu cầu điều đó trong mã, nhưng có lẽ bạn thực sự chỉ muốn ;
hoạt động như một dấu tách. Trong trường hợp đó, bạn có thể muốn chuyển ';'
làm dấu phân tách và cắt các chuỗi được trả về.
Đọc tài liệu. Có lẽ không như mong đợi, nhưng nó hoạt động như tài liệu. –
Câu hỏi này có một số gợi ý về tách một chuỗi, dựa trên chuỗi ký tự nhiều (bạn mong đợi nó đang làm), nhưng hầu hết trong số chúng hoạt động với danh sách chuỗi chứ không phải mảng: http://stackoverflow.com/questions/15424293/làm thế nào để chia nhỏ chuỗi-by-a-đa-ký tự-delimiter – quasoft