powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Аналог функции Split в Delphi
25 сообщений из 46, страница 1 из 2
Аналог функции Split в Delphi
    #33020464
anjey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброе время суток всем, читающим.
А может кто подскажет, такую весчь.

В VisualBasic есть функция :
Split(string, delimiter)
получает строку string и символ-разделитель delimiter
возвращает массив который получается разбиением строки string на части по разделителю delimiter.
Т.е. вызов Split("whatafuck","a") вернет массив из трех элементов: wh t fuck

Может есть альтернатива такой функции в Delphi ?
...
Рейтинг: 0 / 0
Аналог функции Split в Delphi
    #33020484
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DelimitedText property (TStrings)

Represents all the strings in the TStrings object as a single delimited string.

Delphi syntax:

property DelimitedText: string;

Description

Use DelimitedText to get or set all the strings in the TStrings object in a single string.

When reading DelimitedText, the resulting value delimits individual strings in two ways: each string is surrounded (before and after) by the quote character specified by the QuoteChar property. In addition, individual strings are separated by the character specified by the Delimiter property.

When writing DelimitedText, individual strings must be separated using QuoteChar at both ends, using Delimiter as a separator, or using both these methods.

Note: CommaText is the same as the DelimitedText property when Delimiter is ',' and QuoteChar is '"'.
...
Рейтинг: 0 / 0
Аналог функции Split в Delphi
    #33020490
ZrenBy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 procedure  TForm1.Button1Click(Sender: TObject);
 var  S: String ; sl:TStringList; n:Integer;
 begin 
  S := 'whatafuck';
  sl := TStringList.Create;
   try 
    sl.Delimiter     := 'a';
    sl.DelimitedText := S;
     for  n:= 0   to (sl.Count- 1 ) do  Application.MessageBox(PChar(sl.Strings[n]),'', 0 );
   finally 
    sl.Free;
   end ;
 end ;
...
Рейтинг: 0 / 0
Аналог функции Split в Delphi
    #33024399
anjey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо ... однако
...
Рейтинг: 0 / 0
Аналог функции Split в Delphi
    #33032645
anjey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот попробовал, однако, таким способом разбивать на куски текст разделенный символом ; (точка_запятой)... в итоге получается какая-то ерунда. Delimiter у меня соответсвенно точка_с_запятой, а разбивается текст не толко по точке с запятой но и почему-то по некоторым пробелам ?!?!
...
Рейтинг: 0 / 0
Аналог функции Split в Delphi
    #33032671
Фотография Di_LIne
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anjeyВот попробовал, однако, таким способом разбивать на куски текст разделенный символом ; (точка_запятой)... в итоге получается какая-то ерунда. Delimiter у меня соответсвенно точка_с_запятой, а разбивается текст не толко по точке с запятой но и почему-то по некоторым пробелам ?!?!
А может это не "пробелы", а "перевод строки" (#13#10)?
...
Рейтинг: 0 / 0
Аналог функции Split в Delphi
    #33032748
anjey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нет, обычный пробел :(
...
Рейтинг: 0 / 0
Аналог функции Split в Delphi
    #33032774
Сержант Золотарев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, что-нить такое:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
 const 
  WordDelimiter:  set   of  Char = [# 0 ..# 255 ] - ['a'..'z','A'..'Z','1'..'9','0',
  'А'..'Я', 'а'..'я'];  // Поправьте меня... :) 

 function  NextWord( var  P: PChar):  string ;
 var 
  i: Integer;
 begin 
  i :=  0 ;
   // Отбрасываем разделители 
   while   not  (P  in  WordDelimiter)  and  (i < length(P))  do 
    Inc(i);
  SetString(Result, P, i);
   while  (P[i]  in  WordDelimiter)  and  (i < length(P))  do   [i]// Пропускаем разделители 
    Inc(i);
  Inc(P, i);
 end ;

 procedure  ParseText ( const  AStringList : TStringList; const  AText :  String );
 var 
  P: PChar;
  fWord:  string ;
 begin 
     if  AText = ''  then  Exit;
    P := PChar(AText);
     // Разделители - долой 
     while  P^  in  WordDelimiter  do 
      Inc(P);

    fWord := NextWord(P);
     while  fWord <> ''  do 
     begin 
      AStringList.Add(AnsiUpperCase(fWord));  // Будем для простоты игнорировать регистр 
      fWord := NextWord(P);
     end ;
 end ;
...
Рейтинг: 0 / 0
Аналог функции Split в Delphi
    #33402452
FM_Xenon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если эта тема еще кого нибудь интересует, то могу предложить следующее решение:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
function Split(const StringParam: String; const DelimChar: String): Variant;
  
var
  sTMP  : string;
  sa      : array of string;
  n,i,y   : Integer;

begin
  try
      sTMP:=StringParam;
      n:=Pos(DelimChar, sTMP)-1;
      i:=0;
      y:=Length(DelimChar);

    while n>0 do begin
      i:=i+1;
      SetLength(sa,i);
      sa[i-1]:=Copy(sTMP,1,n);

      Delete(sTMP,1,n+y);

      n:=Pos(DelimChar, sTMP)-1;
    end;
      i:=i+1;
      n:=Length(sTMP);
      SetLength(sa,i);
      sa[i-1]:=Copy(sTMP,1,n);
      Result:=sa;
  finally
      sTMP:='';
      sa:=nil;
  end;
end;

// Вызываем функцию и проверяем результат:

procedure TForm1.Button1Click(Sender: TObject);
  var
  S:String;
  s1: array of string;
begin

  S := 'whatafuck' +#6+ 'mather bich!' +#6+ ' fly ' + #6 + 'awey!';
  s1:=Split(S,#6);

ShowMessage (s1[1]);
  s1:=nil;
end;



Если все-же хочеться реализовать Split через TStrings, то лучше создать его потомка и переписать пару методов, где знак пробела(и не только) прописан на мертво:

в "procedure TStrings.SetDelimitedText(const Value: string);"
есть, к примеру цикл с таким интересным условием: "while (P^ > ' ') and (P^ <> Delimiter) do"

или в "function TStrings.GetDelimitedText: string;"
наши строки читаются в цикле с таким условием: "while not (P^ in [#0..' ', QuoteChar, Delimiter]) do". - Как видите, для поклонников Split'a все складывается очень плохо :) Тем более, если представить, что разделителем может потребоваться использовать не один символ, а два или вообще целое слово. Да и потом не забывайте, что в TStrings есть еще такой параметр, как "NameValueSeparator", который по умолчанию равен '='.
...
Рейтинг: 0 / 0
Аналог функции Split в Delphi
    #33402661
Фотография Jozo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StringRepace тебе поможет
укажеш что искать и на что менять .. и вуаля
...
Рейтинг: 0 / 0
Аналог функции Split в Delphi
    #33403167
FM_Xenon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JozoStringRepace тебе поможет
укажеш что искать и на что менять .. и вуаля
Replace??? А зачем он мне?
Если мне нужно из COM объекта написанного на VB6 передать сложную строковую структуру (с размером некоторых элементов больше 255 символов) в сервис-сервер, а из него переслать удаленному клиенту? А перед этим скормить серверу часть параметров для сборки строки подключения, SQL-запрос и еще ряд переменных параметров? Что и на что я там буду менять?
А со Split'ом я премило все разделяю на массивы строк, пользуясь специфическими разделителями, типа #6,#7,#8,#10,#13. И Replace, тут точно, ну ни каким местом...
...
Рейтинг: 0 / 0
Аналог функции Split в Delphi
    #33403386
Фотография Jozo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FM_Xenon
вопрос был вобщето такой :
anjeyДоброе время суток всем, читающим.
А может кто подскажет, такую весчь.

В VisualBasic есть функция :
Split(string, delimiter)
получает строку string и символ-разделитель delimiter
возвращает массив который получается разбиением строки string на части по разделителю delimiter.
Т.е. вызов Split("whatafuck","a") вернет массив из трех элементов: wh t fuck

Может есть альтернатива такой функции в Delphi ?

и что мешает зделать так
...............
t:=TStringList.create;
t.text:=stringReplace('whatafuck','a',#13#10,[rfReplaceAll]);
showmessage(t[0]); // -- wh
...............
...
Рейтинг: 0 / 0
Аналог функции Split в Delphi
    #33403854
Фотография Pavel Tsukanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй. Я вот этим пользуюсь. Правда требует QStrings
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
 procedure  SplitStr( const  SubStr, AStr:  string ; Split: TStrings);
 var 
  CurrentPosition : integer;
  PositionEndSubStr : integer;
 begin 
  CurrentPosition :=  1 ;
  Split.Clear;
   while  CurrentPosition <= Length(AStr)  do 
   begin 
    PositionEndSubStr := Q_PosStr(SubStr,AStr,CurrentPosition);
     case   PositionEndSubStr  of 
     0  :  begin 
          Split.Add(Copy(AStr,CurrentPosition,Length(AStr) - CurrentPosition +  1 ));
          CurrentPosition := Length(AStr) +  1 ;
         end ;
     1  :  begin 
          CurrentPosition := Length(SubStr) +  1 ;
          Continue;
         end ;
     else 
      Split.Add(Copy(AStr,CurrentPosition,PositionEndSubStr - CurrentPosition));
      CurrentPosition := PositionEndSubStr + Length(SubStr);
     end ;
   end ;
 end ;

...
Рейтинг: 0 / 0
Аналог функции Split в Delphi
    #33403863
Фотография Pavel Tsukanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если нет QStrinngs то вот Q_PosStr
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
 function  Q_PosStr( const  FindString, SourceString:  string ; StartPos: Integer): Integer;
 asm 
        PUSH    ESI
        PUSH    EDI
        PUSH    EBX
        PUSH    EDX
        TEST    EAX,EAX
        JE      @@qt
        TEST    EDX,EDX
        JE      @@qt0
        MOV     ESI,EAX
        MOV     EDI,EDX
        MOV     EAX,[EAX- 4 ]
        MOV     EDX,[EDX- 4 ]
        DEC     EAX
        SUB     EDX,EAX
        DEC     ECX
        SUB     EDX,ECX
        JNG     @@qt0
        XCHG    EAX,EDX
        ADD     EDI,ECX
        MOV     ECX,EAX
        JMP     @@nx
@@fr:   INC     EDI
        DEC     ECX
        JE      @@qt0
@@nx:   MOV     EBX,EDX
        MOV     AL,BYTE PTR [ESI]
@@lp1:  CMP     AL,BYTE PTR [EDI]
        JE      @@uu
        INC     EDI
        DEC     ECX
        JE      @@qt0
        CMP     AL,BYTE PTR [EDI]
        JE      @@uu
        INC     EDI
        DEC     ECX
        JE      @@qt0
        CMP     AL,BYTE PTR [EDI]
        JE      @@uu
        INC     EDI
        DEC     ECX
        JE      @@qt0
        CMP     AL,BYTE PTR [EDI]
        JE      @@uu
        INC     EDI
        DEC     ECX
        JNE     @@lp1
@@qt0:   XOR      EAX,EAX
@@qt:   POP     ECX
        POP     EBX
        POP     EDI
        POP     ESI
        RET
@@uu:   TEST    EDX,EDX
        JE      @@fd
@@lp2:  MOV     AL,BYTE PTR [ESI+EBX]
        CMP     AL,BYTE PTR [EDI+EBX]
        JNE     @@fr
        DEC     EBX
        JE      @@fd
        MOV     AL,BYTE PTR [ESI+EBX]
        CMP     AL,BYTE PTR [EDI+EBX]
        JNE     @@fr
        DEC     EBX
        JE      @@fd
        MOV     AL,BYTE PTR [ESI+EBX]
        CMP     AL,BYTE PTR [EDI+EBX]
        JNE     @@fr
        DEC     EBX
        JE      @@fd
        MOV     AL,BYTE PTR [ESI+EBX]
        CMP     AL,BYTE PTR [EDI+EBX]
        JNE     @@fr
        DEC     EBX
        JNE     @@lp2
@@fd:   LEA     EAX,[EDI+ 1 ]
        SUB     EAX,[ESP]
        POP     ECX
        POP     EBX
        POP     EDI
        POP     ESI
 end ;


...
Рейтинг: 0 / 0
Аналог функции Split в Delphi
    #33404512
FM_Xenon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JozoFM_Xenon
вопрос был вобщето такой :
anjeyДоброе время суток всем, читающим.
А может кто подскажет, такую весчь.

В VisualBasic есть функция :
Split(string, delimiter)
получает строку string и символ-разделитель delimiter
возвращает массив который получается разбиением строки string на части по разделителю delimiter.
Т.е. вызов Split("whatafuck","a") вернет массив из трех элементов: wh t fuck

Может есть альтернатива такой функции в Delphi ?

и что мешает зделать так
...............
t:=TStringList.create;
t.text:=stringReplace('whatafuck','a',#13#10,[rfReplaceAll]);
showmessage(t[0]); // -- wh
...............
Вы в серьез думете, что человеку нужно было распихать "watafuck" в массив?
А если будет "what a fuck"? Будем сначала пробелы заменять на, допустим '#', потом распихивать в ТStrings, а потом пустим цикл по строкам и заменим '#' обратно на #32? Ну если речь идет только о "what a fuck", то возможно так и стоит сделать... Хотя, как-то кривовато. А если такая строка:

"C:\MyBase\Old Base\my base.mdb[#7]Admin[#8][#7]REESTR[#8]Дата выдачи[#8]Срок действи[#8]Разрешения[#8]SubText[#8]ИНН=78021202144[#7]IsAdd^Разрешения[#6]2100240[#17]Сбор, переработка и реализация группы 1[#11]2100241[#17]Сбор, переработка и реализация группы 2[#11]2100242[#17]Сбор, переработка и реализация группы 3[#11]2100243[#17]Сбор, переработка и реализация группы 4[#11]2200162[#17]Лабораторный анализ материалов[#4]SubText[#6]В соответсвии со ст. 12 п.1 Положения о деятельности металлургических предприятий (во исполнение ст. 71 [#13#10]Закона Занзибара о Разрешениях), приказом №34 от 12.11.05 Федеральной комисии, назначена проведена проверка [#13#10] деятельности предприятия. Ввиду особых разпоряжений комиссии, в ходе проверки [#13#10] были выявлены следующие недостатки:[#13#10]
%112;[#13#10]
%12;[#13#10]
%76;[#13#10]
%210;[#13#10]
%7.[#13#10]
Для утранения выявленных недостатков предприятию установлен срок до 12.12.05.[#13#10]
Председатель Комиссии:[#13#10]
В.В.Пупкин."[#2]SysLog=Прохоров^SysPas=1aUTYw4oG^End^"
Ну и как быть с этим?
Или все же будете опять твердить про "watafuck" и кривой TStrings?
Вопрос-то, на самом деле, был про аналог Split'a. А Split в описанном мой случае не заменим. Тем более, когда нужно правильно считать структуру собранную по определенным правилам.
...
Рейтинг: 0 / 0
Аналог функции Split в Delphi
    #33412060
FM_Xenon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объеденил я тут все выше изложенное и вместо TStringsa подставил динамический строчный массив (type StrArr=array of String;).

Работает все очень быстро - по скорости не уступает импортированному из dll-ки vb'шному Split'у! И память практически не отжирает. Короче - моя очень довольна! Особое спасибо Pavlu Tsukanovu за ассемблерный код!
Первая функция использует в качестве разделителя только символ, а вторая строку. Если передавать возвращаемый массив через Result(Variant) - будут тормоза.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
type StrArr=array of String;

function Split(var StringParam: String; var DelimChar: String; out ResultArray: StrArr): boolean; overload;
var
  n,i,y       : Integer;
  x,z         : Integer;
  Index,Count : Integer;
  s           : string;
begin

  try
  try
    x:=Q_PosStr(DelimChar,StringParam,1);

    if x=0 then begin
          SetLength(ResultArray,1);
          ResultArray[0]:=StringParam;
          Result:=True;
          Exit;
    end; {if}

          y:=Length(DelimChar);
          s:=Copy(StringParam,1,x-1);

    n:=1;
    i:=x;

  while Not (i=0) do begin
    n:=n+1;
    i:=Q_PosStr(DelimChar,StringParam,i+y);
  end;{while True}

    SetLength(ResultArray,n);
    ResultArray[0]:=s;

  n:=1;
  i:=x;

   while Not (i=0) do begin
      i := Q_PosStr(DelimChar,StringParam,i+y);

      if i=0 then break;

      count :=  i-x-y;
      index :=  x+y;
      ResultArray[n]:=Copy(StringParam,index,count);

      n:=n+1;
      x:=i;

   end;{while True}

   z:=length(StringParam)-(x);
   If z>0 then ResultArray[n]:=Copy(StringParam,x+y,z);

      Result:=True;
  except
      Result:=False;
  end;{except}
  finally

      If Result then Result:=True;
  end;{finally}
end;

function Split(const Extension: String; DelimChar: Char; out  StrArrRes: StrArr): Boolean;
  var
  p,sp:PChar;
  Delimiters: set of Char;
  str:String;
  Ca:Cardinal;
  n:integer;
  bw:Boolean;
begin
bw:=True;
n:=1;
Delimiters:=[];

try
try
 include(Delimiters,DelimChar);
 include(Delimiters,#0); //чтоб уж наверняк
 p:=pointer(Extension);

while bw do
  begin
   //пропускаем все разделители в начале
   while (p^ in Delimiters) do
      if p^=#0 then begin
            bw:=False;{while bw}
            break; {while p^}
          end else begin
            n:=n+1;
            inc(p);
      end;{if}{while p^ }
   while not (p^ in Delimiters) do inc(p);
end;{while dw}

p:=pointer(Extension);
SetLength(StrArrRes, n);
n:=0;
bw:=True;
                  while bw do begin

                          sp:=p;
                        //пока не кончилось слово.
                          while not (p^ in Delimiters) do inc(p);
                            //запоминаем слово
                            ca:=Cardinal(p)-Cardinal(sp);
                            SetLength(str,ca);
                            Move(sp^,pointer(str)^,ca);
                            StrArrRes[n]:=String(str);

                       //пропускаем все разделители в начале
                         while (p^ in Delimiters) do
                          if p^=#0 then begin
                                bw:=False;{while bw}
                                break; {while p^}
                            end else begin
                              n:=n+1;
                              //StrArrRes[n-1]:=String(str);
                              inc(p);
                          end;{if}{while p^}

                          //if not bw then break;

                  end; {while bw}

    except
        SetLength(StrArrRes,0);
        Result:=False;
    end;{except}
finally
      If Result then Result:=True;
end;{finally}
end;{function}

function Q_PosStr(const FindString, SourceString: string; StartPos: Integer): Integer;
asm
        PUSH    ESI
        PUSH    EDI
        PUSH    EBX
        PUSH    EDX
        TEST    EAX,EAX
        JE      @@qt
        TEST    EDX,EDX
        JE      @@qt0
        MOV     ESI,EAX
        MOV     EDI,EDX
        MOV     EAX,[EAX-4]
        MOV     EDX,[EDX-4]
        DEC     EAX
        SUB     EDX,EAX
        DEC     ECX
        SUB     EDX,ECX
        JNG     @@qt0
        XCHG    EAX,EDX
        ADD     EDI,ECX
        MOV     ECX,EAX
        JMP     @@nx
@@fr:   INC     EDI
        DEC     ECX
        JE      @@qt0
@@nx:   MOV     EBX,EDX
        MOV     AL,BYTE PTR [ESI]
@@lp1:  CMP     AL,BYTE PTR [EDI]
        JE      @@uu
        INC     EDI
        DEC     ECX
        JE      @@qt0
        CMP     AL,BYTE PTR [EDI]
        JE      @@uu
        INC     EDI
        DEC     ECX
        JE      @@qt0
        CMP     AL,BYTE PTR [EDI]
        JE      @@uu
        INC     EDI
        DEC     ECX
        JE      @@qt0
        CMP     AL,BYTE PTR [EDI]
        JE      @@uu
        INC     EDI
        DEC     ECX
        JNE     @@lp1
@@qt0:  XOR     EAX,EAX
@@qt:   POP     ECX
        POP     EBX
        POP     EDI
        POP     ESI
        RET
@@uu:   TEST    EDX,EDX
        JE      @@fd
@@lp2:  MOV     AL,BYTE PTR [ESI+EBX]
        CMP     AL,BYTE PTR [EDI+EBX]
        JNE     @@fr
        DEC     EBX
        JE      @@fd
        MOV     AL,BYTE PTR [ESI+EBX]
        CMP     AL,BYTE PTR [EDI+EBX]
        JNE     @@fr
        DEC     EBX
        JE      @@fd
        MOV     AL,BYTE PTR [ESI+EBX]
        CMP     AL,BYTE PTR [EDI+EBX]
        JNE     @@fr
        DEC     EBX
        JE      @@fd
        MOV     AL,BYTE PTR [ESI+EBX]
        CMP     AL,BYTE PTR [EDI+EBX]
        JNE     @@fr
        DEC     EBX
        JNE     @@lp2
@@fd:   LEA     EAX,[EDI+1]
        SUB     EAX,[ESP]
        POP     ECX
        POP     EBX
        POP     EDI
        POP     ESI
end;

...
Рейтинг: 0 / 0
Аналог функции Split в Delphi
    #33412067
FM_Xenon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S.:
FM_XenonПервая функция использует в качестве разделителя только символ, а вторая строку.

- С точностью до на оборот.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Аналог функции Split в Delphi
    #39312949
Nomad_Razor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот исправленный код
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
Procedure TLoadDocs.Split(s: string;delimited_char:char; var delimited_out: TStringList);
var
i:integer;
current_pos:integer;
delimited:TStringList;
begin
  delimited:=TStringList.Create;
  current_pos:=1;
  showmessage(s);
  if s[length(s)]<>delimited_char then s:=s+Delimited_char;
  showmessage(s);
  i:=1;
  while (i <> length(s)) do
    begin
      while s[i]<>delimited_char do
            begin
            inc(i);
            if i=length(s) then break;
            end;
      delimited.Add(copy(s,current_pos,i-current_pos));
      current_pos:=i+1;
      if i<>length(s) then
      inc(i);
    end;
  delimited_out:=delimited;
end;
...
Рейтинг: 0 / 0
Аналог функции Split в Delphi
    #39312968
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В этом тысячелетии делают так:

'kisa;kuku'.Split(';');
...
Рейтинг: 0 / 0
Аналог функции Split в Delphi
    #39313023
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nomad_RazorВот исправленный код


Прошло 11 лет. Не надо такой код показывать, он некрасивый.
...
Рейтинг: 0 / 0
Аналог функции Split в Delphi
    #39313031
Фотография Makar4ik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...другой вопрос, а что такое "массив из трех элементов"???

StringReplace('whatafuck', 'a', #13#10, [rfReplaceAll]);
или:
StringReplace('whatafuck'#0#0, 'a', #0, [rfReplaceAll]); ??????
или:
Код: pascal
1.
2.
3.
4.
5.
var TS : TStringList;
begin
  TS := TstringList.Create;
  TS.Text :=  StringReplace('whatafuck', 'a', #13#10, [rfReplaceAll]);
.......
...
Рейтинг: 0 / 0
Аналог функции Split в Delphi
    #39313121
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SplitString быстрее будет, чем TStringList.
...
Рейтинг: 0 / 0
Аналог функции Split в Delphi
    #39313162
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выбираем понравившийся:

http://stackoverflow.com/questions/2625707/split-a-string-into-an-array-of-strings-based-on-a-delimiter

Сканирование 'вдоль' строки на предмет поиска сепаратора с последующим копированием кусков в массив мне видится одним из самых быстрых реализаций, если не самой.
...
Рейтинг: 0 / 0
Аналог функции Split в Delphi
    #39313349
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanSplitString быстрее будет, чем TStringList.Кстати да. В D2010 этой функции ещё нет, а в XE3 уже, наконец, есть, модуль StrUtils. На днях обнаружил и впервые использовал. )

Код: pascal
1.
function SplitString(const S, Delimiters: string): TStringDynArray;
...
Рейтинг: 0 / 0
Аналог функции Split в Delphi
    #39313827
Фотография DetSimen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а в ХЕ10 уже даже есть TStringHelper.Split. :)
...
Рейтинг: 0 / 0
25 сообщений из 46, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Аналог функции Split в Delphi
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]