<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=348552&amp;view=findpost&amp;p=2551973</guid>
        <pubDate>Tue, 30 Mar 2010 11:26:56 +0000</pubDate>
        <title>Функции Split и GetElement</title>
        <link>https://forum.sources.ru/index.php?showtopic=348552&amp;view=findpost&amp;p=2551973</link>
        <description><![CDATA[Fr0sT: <strong class='tag-b'><span class="tag-color tag-color-named" data-value="purple" style="color: purple"><span class='tag-size' data-value='14' style='font-size:14pt;'>Расщепление на массив</span></span></strong><br>
<br>
Аналог split() из php, расщепляет исходную строку на массив подстрок, основываясь на символах-разделителях<br>
Например:<br>
&#39;однажды;в;студёную;зимнюю;пору&#39; -&gt; [&#39;однажды&#39;, &#39;в&#39;, &#39;студёную&#39;, &#39;зимнюю&#39;, &#39;пору&#39;]<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">uses StrUtils; // для PosEx</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;TStrArray = array of string; // собственный тип, хотя можно пользоваться и стандартным TStringDynArray из Types</div><div class="code_line">&nbsp;</div><div class="code_line">// Расщепление строки на массив элементов</div><div class="code_line">// AllowEmpty - флаг, указывающий, добавлять ли в массив пустые подстроки</div><div class="code_line">// если равен False, они будут пропущены</div><div class="code_line">function Split(const Str: string; Delim: Char=&#39;;&#39;; AllowEmpty: Boolean=True): TStrArray;</div><div class="code_line">var CurrDelim, NextDelim, CurrIdx: Integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if Str = &#39;&#39; then begin SetLength(Result, 0); Exit; end;</div><div class="code_line">&nbsp;&nbsp;CurrDelim := 1; CurrIdx := 0; SetLength(Result, 16);</div><div class="code_line">&nbsp;&nbsp;repeat</div><div class="code_line">&nbsp;&nbsp; &nbsp;if CurrIdx = Length(Result) then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;SetLength(Result, CurrIdx+16); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // проверяем наполненность массива и расширяем при необходимости</div><div class="code_line">&nbsp;&nbsp; &nbsp;NextDelim := PosEx(Delim, Str, CurrDelim); &nbsp; &nbsp; &nbsp; &nbsp;// позиция следующего разделителя</div><div class="code_line">&nbsp;&nbsp; &nbsp;if NextDelim = 0 then NextDelim := Length(Str)+1; // строка кончилась</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result[CurrIdx] := Copy(Str, CurrDelim, NextDelim-CurrDelim);</div><div class="code_line">&nbsp;&nbsp; &nbsp;CurrDelim := NextDelim+1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// если элемент непуст или же пустые допустимы - увеличиваем индекс</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (Result[CurrIdx] &#60;&#62; &#39;&#39;) or AllowEmpty</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;then Inc(CurrIdx)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;else Continue;</div><div class="code_line">&nbsp;&nbsp;until CurrDelim &#62; Length(Str);</div><div class="code_line">&nbsp;&nbsp;SetLength(Result, CurrIdx); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// обрезаем массив</div><div class="code_line">end;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
Применение:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp;arr := Split(&#39;однажды;в;студёную;зимнюю;пору&#39;);</div><div class="code_line">&nbsp;&nbsp;arr := Split(&#39;name=Ivan|surname=Susanin|birthdate=N/A|gender=M&#39;, &#39;|&#39;);</div><div class="code_line">&nbsp;&nbsp;arr := Split(&#39;yellow/white//black/red//&#39;, &#39;/&#39;, False);</div></ol></div></div></div></div><br>
<br>
<strong class='tag-b'><span class="tag-color tag-color-named" data-value="purple" style="color: purple"><span class='tag-size' data-value='14' style='font-size:14pt;'>Получение одной подстроки</span></span></strong><br>
<br>
Получает подстроку, имеющую указанный индекс (0-based). Пригодится в случае, когда нет нужды в целом массиве. Также можно использовать для выделения подстрок из значений типа &quot;name=value&quot;<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">function GetElement(const Str: string; ElemIdx: Word; Delim: Char=&#39;;&#39;): string;</div><div class="code_line">var CurrDelim, NextDelim, Idx: Integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := &#39;&#39;; CurrDelim := 0;</div><div class="code_line">&nbsp;&nbsp;// num раз ищем символ разделителя в строке</div><div class="code_line">&nbsp;&nbsp;for Idx := 1 to ElemIdx do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;CurrDelim := PosEx(Delim, Str, CurrDelim+1);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if CurrDelim = 0 then Exit;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;Inc(CurrDelim); // теперь здесь индекс первого символа нужного нам элемента</div><div class="code_line">&nbsp;&nbsp;NextDelim := PosEx(Delim, Str, CurrDelim); // ищем конечный разделитель</div><div class="code_line">&nbsp;&nbsp;if NextDelim = 0 then NextDelim := Length(Str)+1;</div><div class="code_line">&nbsp;&nbsp;Result := Copy(Str, CurrDelim, NextDelim-CurrDelim);</div><div class="code_line">end;</div></ol></div></div></div></div><br>
<br>
Применение:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp;s := GetElement(&#39;однажды;в;студёную;зимнюю;пору&#39;, 3);</div><div class="code_line">&nbsp;&nbsp;if GetElement(&#39;name=Ivan&#39;, 1, &#39;=&#39;) = &#39;Nikanor&#39; then...</div></ol></div></div></div></div><br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Эта тема была разделена из темы &quot;<a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=299082' target='_blank'>Функции Split и GetElement</a>&quot;</span></span>]]></description>
        <author>Fr0sT</author>
        <category>Алгоритмы</category>
      </item>
	
      </channel>
      </rss>
	