How to split a string/array with multiple separators?

Thorsten Sommer via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu May 12 12:25:08 PDT 2016


On Wednesday, 16 December 2015 at 15:27:22 UTC, Marc Schütz wrote:
> On Wednesday, 16 December 2015 at 14:47:26 UTC, Dragos Carp 
> wrote:
>> On Wednesday, 16 December 2015 at 14:18:28 UTC, Borislav 
>> Kosharov wrote:
>>> I want to split a string using multiple separators. In 
>>> std.array the split function has a version where it takes a 
>>> range as a separator, but it works differently than what I 
>>> want. Say if I call it with " -> " it will search for the 
>>> whole thing together. I want to pass split a list of 
>>> separators say [":", ",", ";"] and if it finds any of those 
>>> to split it.
>>>
>>> Sorry if this questions is stupid but I cant find how to do 
>>> it.
>>
>>
>> void main()
>> {
>>
>>    import std.stdio: writeln;
>>    writeln("abc,def;ghi".splitter!(a => 
>> !":,;".find(a).empty).array);
>> }
>
> The call to `array` is unnecessary in this example, and you can 
> use the shorter `canFind`:
>
>    writeln("abc,def;ghi".splitter!(a => ":,;".canFind(a)));


Dear Borislav, Dragos and Marc,

Thanks for this question (@Borislav) and the solution's 
approaches (@Dragos and @Marc). Today, I had the same task and 
tried to find a solution for it. Unfortunately, the proposed 
solutions seem not work.

Here is the version from Dragos (run it directly on the web):
http://ideone.com/fglk0s

Here the version from Marc:
http://ideone.com/yCaYrD

In both cases, I got the "Error: template 
std.algorithm.iteration.splitter cannot deduce function from 
argument types [...]" message.

Can anyone help me with a functional example? That would be great 
:)


Best regards,
Thorsten


More information about the Digitalmars-d-learn mailing list