On 02/19/2016 10:10 AM, Nordlöw wrote:
Have anybody put together a generalised form of findSplit that can split
and decode using a compile time parameters somewhat like

"(1)-(2.0)".decode!("(", int, ")", char, "(", double, ")")

evaluates to

to a

tuple!(int, char, double)

with value

tuple(1, '-', 2.0)

The following toy program works with that particular case but can be templatized:

import std.stdio;
import std.string;
import std.regex;
import std.typecons;
import std.conv;

auto decode(string s) {
    // Warning: Treats "012" as int (value 12), not octal (value 10).
    enum intClass = `[0-9]+`;

    enum charClass = `.`;

    // Found on the internet:
    enum floatClass = `[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?`;

    enum expr = format(`[(](%s)[)](%s)[(](%s)[)]`,
                       intClass, charClass, floatClass);
    enum r = ctRegex!expr;

    auto matched = s.match(r);

    if (matched) {
        foreach (e; matched) {
            // We are ignoring potential other matches on the same line and
// returning just the first match. (Of course, no loop is needed.)
            return tuple(e[1].to!int, e[2].to!char, e[3].to!double);
        }
    }

    return Tuple!(int, char, double)();
}

void main() {
    auto t = decode("(1)-(2.5)");
    writeln(t);
}

Ali

Reply via email to