<div dir="ltr">Splitting a string into multiple parts based on a literal (as opposed to regular expression or set of characters) string delimiter is an extremely common operation in text processing. Its equal and opposite partner, join, is also very common. split and join are complementary functions (that's just what I call them here, so even if there's some more accurate or widely used terminology, please bear with me).<br>
<br>At present, string:join exists and behaves like its cousins in other programming languages. There is an <i>almost</i>, but not quite complementary function in the string module: string:tokens/2.<br><br>It <i>should</i> be possible to perform an idempotent transformation as follows:<br>
<br><span style="font-family: courier new,monospace;">Input = "A,,B,C,",</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">Sep = ",",</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">Output = string:join(string:tokens(Input, Sep), Sep),</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">Output =:= Input.</span><br>
<br>The above would return <b>true</b> if string:join and string:tokens were truly complementary, but it does not.<br><br>However, there is nothing <i>wrong</i> with string:tokens as it stands today (except maybe that it's a bit underdocumented, for example, by not mentioning that it treats consecutive sequences of delimiters as a single delimiter). It does what its name suggests: tokenizes a string based on a set of token characters. In a tokenization operation, you usually <i>want</i> to skip multiple identical token delimiters, and that's precisely what it does. I am not proposing a change to string:tokens; I <i>am</i> proposing <b>the addition of string:split/2</b>.<br>
<p><a style="font-family: courier new,monospace;" name="join-2"><span class="bold_code">split(String, Separator) -> List</span></a><br>

</p>

<div class="REFBODY"><p>Types:</p>
  <div class="REFTYPES">
<p>
<span style="font-family: courier new,monospace;" class="bold_code">String = string()</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;" class="bold_code">Separator = string()<br>List = [string()]</span><span class="bold_code"><br></span></p></div>
</div>



<p>Returns a list of strings that were separated in String by Separator.</p><p>Separator can contain any number of characters, including zero. <br></p><p>Leading separators will result in empty strings as the first elements of the returned list; the same is true for trailing separators and multiple consecutive separators.</p>
<p>If Separator is the empty string, the returned list will be identical to the list returned by <span style="font-family: courier new,monospace;">[[X] || X <- String]</span>.<br></p><p>If Separator cannot be found in String, the returned list will be [String]. In general, if there are N separators embedded in String, the returned list will contain N+1 strings. </p>
<p>Examples:<br><span style="font-family: courier new,monospace;">> string:split(":", ":This:is::a:contrived:example::").</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">["","This","is","","a","contrived","example","",""]<br>
> string:split("", "Hello").</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">["H","e","l","l","o"]</span><br>
</p><b>Existing Alternatives</b><br><br>
There are no existing alternatives that I could find that have similar
syntactic, semantic, and performance characteristics to split. Anything
using regular expressions is more cumbersome and probably slower, and
simulating this using Erlang code would also present performance penalties. I searched the list archives using the phrases "string split" and string:split, but found nothing that would cause me not to submit this proposal. EEP 9 does mention a binary_string:split, but I still feel that string:split would be a worthwhile addition to balance string:join.<br>
<br>I believe this is too trivial an addition to warrant an EEP, so I am proposing it to the list for comment.<br><br></div>