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