phobos and splitting things... but not with whitespace.

simendsjo simendsjo at gmail.com
Sat Jun 23 11:17:55 PDT 2012


On Sat, 23 Jun 2012 19:52:32 +0200, Chad J  
<chadjoan at __spam.is.bad__gmail.com> wrote:

>
> As an additional note: I could probably do this easily if I had a  
> function like findSplit where the predicate is used /instead/ of a  
> delimiter.  So like this:
>  auto findSplit(alias pred = "a", R)(R haystack);
> ...
> auto tuple = findSplit!(`a == "\n" || a == "\r\n" || a == "\r"`)(text);
> return tuple[2];

I don't think it can match on ranges, but it's pretty trivial to implement  
something that would work for your case

import std.array, std.algorithm, std.typecons;

auto newlineSplit(string data) {
     auto rest = data.findAmong("\r\n");
     if(!rest.empty) { // found
         auto pre = data[0..data.length-rest.length];
         string match;
         if(rest.front == '\r' && (rest.length > 1 && rest[1] == '\n')) {  
// \r\n
             match = rest[0..2];
             rest = rest[2..$];
         } else { // \r or \n
             match = rest[0..1];
             rest = rest[1..$];
         }
         return tuple(pre, match, rest);
     } else {
         return tuple(data, "", "");
     }
}
unittest {
     auto text = "1\n2\r\n3\r4";
     auto res = text.newlineSplit();
     assert(res[0] == "1");
     assert(res[1] == "\n");
     assert(res[2] == "2\r\n3\r4");

     res = res[2].newlineSplit();
     assert(res[0] == "2");
     assert(res[1] == "\r\n");
     assert(res[2] == "3\r4");

     res = res[2].newlineSplit();
     assert(res[0] == "3");
     assert(res[1] == "\r");
     assert(res[2] == "4");

     res = res[2].newlineSplit();
     assert(res[0] == "4");
     assert(res[1] == "");
     assert(res[2] == "");
}


More information about the Digitalmars-d-learn mailing list