Tương tự như hàm Explode () do Mef cung cấp, nhưng có một vài điểm khác biệt (một trong số đó tôi coi là một bản sửa lỗi):
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;
Sự khác biệt:
- Tham số aMax giới hạn số lượng chuỗi được trả về
- Nếu chuỗi đầu vào được kết thúc bằng dấu phân tách thì chuỗi cuối cùng "trống" danh nghĩa được coi là tồn tại
Ví dụ:
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
Đó là dấu phân cách theo sau và "phần tử cuối cùng trống" mà tôi coi là bản sửa lỗi.
Tôi cũng kết hợp thay đổi phân bổ bộ nhớ mà tôi đã đề xuất, với sự tinh chỉnh (tôi đã nhầm lẫn khi đề xuất chuỗi đầu vào có thể chứa nhiều nhất 50% dấu phân tách, nhưng có thể hình dung nó tất nhiên bao gồm 100% chuỗi dấu phân cách, tạo ra một mảng các phần tử trống!)