यह फ़ंक्शन लगातार विभाजक को मर्ज करने के लिए डिज़ाइन नहीं किया गया है।
foo,,bar
क्या आप SplitString('foo,,bar', ',')
उम्मीद करेंगे वापस जाने के लिए: उदाहरण के लिए, अल्पविराम पर निम्न स्ट्रिंग बंटवारे पर विचार? क्या आप ('foo', 'bar')
देख रहे हैं या उत्तर ('foo', '', 'bar')
होना चाहिए? यह एक प्राथमिकता स्पष्ट नहीं है जो सही है, और अलग-अलग उपयोग के मामले अलग-अलग आउटपुट चाहते हैं।
यदि आपका मामला है, तो आपने दो डिलीमीटर, ';'
और ' '
निर्दिष्ट किए हैं। इसका मतलब है कि ';'
पर और फिर से ' '
पर
'a'; 'b'
विभाजन। उन दो डिलीमीटरों के बीच कुछ भी नहीं है, और इसलिए 'a'
और 'b'
के बीच एक खाली स्ट्रिंग लौटा दी गई है।
से विधि XE3 में पेश की गई TStringSplitOptions
पैरामीटर है। यदि आप उस पैरामीटर के लिए ExcludeEmpty
पास करते हैं तो लगातार विभाजक को एकल विभाजक के रूप में माना जाता है। इस कार्यक्रम:
{$APPTYPE CONSOLE}
uses
System.SysUtils;
var
S: string;
begin
for S in '''a''; ''b''; ''c'''.Split([';', ' '], ExcludeEmpty) do begin
Writeln(S);
end;
end.
आउटपुट:
'a'
'b'
'c'
लेकिन अब मुझे लगता है कि आप अपने खुद के विभाजन समारोह रोल करने के लिए जा रहे हैं तो आप इस XE2 में आप के लिए उपलब्ध नहीं है। जो इस तरह दिख सकता है:
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;
बेशक, यह सब मानते हैं कि आप एक विभाजक के रूप में कार्य करने के लिए एक जगह चाहते हैं। आपने उस कोड में पूछा है, लेकिन शायद आप वास्तव में एक विभाजक के रूप में कार्य करने के लिए केवल ;
चाहते हैं। उस स्थिति में आप शायद ';'
को विभाजक के रूप में पास करना चाहते हैं, और लौटाए गए स्ट्रिंग को ट्रिम करें।
दस्तावेज़ पढ़ें। शायद उम्मीद के अनुसार नहीं, लेकिन यह दस्तावेज के रूप में काम करता है। –
इस प्रश्न में एक बहु-वर्ण स्ट्रिंग (जो आपने अपेक्षा की थी) के आधार पर एक स्ट्रिंग को विभाजित करने के कुछ सुझाव दिए हैं, लेकिन उनमें से अधिकांश स्ट्रिंग सूचियों के साथ काम करते हैं, सरणी नहीं: http://stackoverflow.com/questions/15424293/how-to-split-string-by-a-multi-character-delimiter – quasoft