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