Parse a String given some delimiters

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun Oct 30 16:47:54 PDT 2016


On 10/30/2016 01:50 PM, Alfred Newman wrote:
> Hello,
>
> I'm migrating some Python code to D, but I stuck at a dead end...
>
> Sorry to provide some .py lines over here, but I got some doubts about
> the best (fastest) way to do that in D.
>
> Executing the function parsertoken("_My   input.string", " _,.", 2) will
> result "input".
> Parsercount("Dlang=-rocks!", " =-") will result 2,
>
> def parsertoken(istring, idelimiters, iposition):
> """
> Return a specific token of a given input string,
> considering its position and the provided delimiters
>
> :param istring: raw input string
> :param idelimiteres: delimiters to split the tokens
> :param iposition: position of the token
> :return: token
> """
>     vlist=''.join([s if s not in idelimiters else ' ' for s in
> istring]).split()
>     return vlist[vposition]
>
> def parsercount(istring, idelimiters):
> """
> Return the number of tokens at the input string
> considering the delimiters provided
>
> :param istring: raw input string
> :param idelimiteres: delimiters to split the tokens
> :return: a list with all the tokens found
> """
>     vlist=''.join([s if s not in vdelimiters else ' ' for s in
> istring]).split()
>     return len(vlist)-1
>
>
> Thanks in advance

Here is something along the lines of what others have suggested:

auto parse(R, S)(R range, S separators) {
     import std.algorithm : splitter, filter, canFind;
     import std.range : empty;

     return range.splitter!(c => separators.canFind(c)).filter!(token => 
!token.empty);
}

unittest {
     import std.algorithm : equal;

     assert(parse("_My   input.string", " _,.").equal([ "My", "input", 
"string" ]));
}

auto parsertoken(R, S)(R range, S separator, size_t position) {
     import std.range : drop;

     return parse(range, separator).drop(position).front;
}

unittest {
     import std.algorithm : equal;

     assert(parsertoken("_My   input.string", " _,.", 1).equal("input"));
}

auto parsercount(R, S)(R range, S separator) {
     import std.algorithm : count;

     return parse(range, separator).count;
}

unittest {
     assert(parsercount("Dlang=-rocks!", " =-") == 2);
}

void main() {
}

Ali



More information about the Digitalmars-d-learn mailing list