Does something like std.algorithm.iteration:splitter with multiple seperators exist?
wobbles via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Wed Mar 23 13:00:55 PDT 2016
On Wednesday, 23 March 2016 at 11:57:49 UTC, ParticlePeter wrote:
> I need to parse an ascii with multiple tokens. The tokens can
> be seen as keys. After every token there is a bunch of lines
> belonging to that token, the values.
> The order of tokens is unknown.
>
> I would like to read the file in as a whole string, and split
> the string with:
> splitter(fileString, [token1, token2, ... tokenN]);
>
> And would like to get a range of strings each starting with
> tokenX and ending before the next token.
>
> Does something like this exist?
>
> I know how to parse the string line by line and create new
> strings and append the appropriate lines, but I don't know how
> to do this with a lazy result range and new allocations.
This isn't tested, but this is my first thought:
void main(){
string testString = "this:is:a-test;"
foreach(str; testString.multiSlice([":","-",";"]))
writefln("Got: %s", str);
}
auto multiSlice(string string, string[] delims){
struct MultiSliceRange{
string m_str;
string[] m_delims;
bool empty(){
return m_str.length == 0;
}
void popFront(){
auto idx = findNextIndex;
m_str = m_str[idx..$];
return;
}
string front(){
auto idx = findNextIndex;
return m_str[0..idx];
}
private long findNextIndex(){
long foundIndex=-1;
foreach(delim; m_delims){
if(m_str.canFind(delim)){
if(foundIndex == -1 || m_str.indexOf(delim)
>= 0)){
foundIndex = m_str.indexOf(delim);
}
}
}
return foundIndex;
}
}
return MultiSliceRange(string, delims);
}
Again, totally untested, but I think logically it should work. (
No D compiler on this machine so it mightn't even compile :] )
More information about the Digitalmars-d-learn
mailing list