import std.stdio;
import std.regex;

void main() 
{
    
}

bool newIsNumeric(string input)
{
    auto m = match(input, regex(`(nan(i|\+nani)?)|((\+|-)?((inf)|(((\d{1,3}(_\d{3})+)|\d+)(\.\d*)?(e(\+|-)(\d{0,3}))?((ul|u)|([l|f]?[i]?))?)))`,"i"));
     return  !m.empty && m.pre == "" && m.hit == input && m.post == "";
}

unittest
{
    assert(newIsNumeric("nan") == true);
    assert(newIsNumeric("nani") == true );
    assert(newIsNumeric("NaN+nani") == true);
    assert(newIsNumeric("nani+nani") == false);
    assert(newIsNumeric("inf") == true);
    assert(newIsNumeric("+inf") == true);
    assert(newIsNumeric("-inf") == true);
    assert(newIsNumeric("nan+inf") == false);
    assert(newIsNumeric("0") == true);
    assert(newIsNumeric("-1") == true);
    assert(newIsNumeric("+15") == true);
    assert(newIsNumeric("-5.58") == true);
    assert(newIsNumeric("-5.58.5") == false);
    assert(newIsNumeric("1_500_000") == true);
    assert(newIsNumeric("+1_500_000") == true);
    assert(newIsNumeric("-1_500.500") == true);
    assert(newIsNumeric("1_500.500") == true);
    assert(newIsNumeric("1500_500") == false);
    assert(newIsNumeric("+1500.5e-50") == true);
    assert(newIsNumeric("-150_000.e+1") == true);
    assert(newIsNumeric("10L") == true);
    assert(newIsNumeric("-5fi") == true);
    assert(newIsNumeric("+1_995_502.123e-52fi") == true);
    assert(newIsNumeric("-infUL") == false);
    assert(newIsNumeric("naN-") == false);
    assert(newIsNumeric("-0.e+9UL") == true);
    
    
    // These fail with the real isNumeric function in std.string
    assert(newIsNumeric("F") == false);
    assert(newIsNumeric("U") == false);
    assert(newIsNumeric("L") == false);
    assert(newIsNumeric("i") == false);
    assert(newIsNumeric("fi") == false);
    assert(newIsNumeric("ul") == false);
    assert(newIsNumeric("li") == false);

    assert(newIsNumeric(".") == false);
    assert(newIsNumeric("-") == false);
    assert(newIsNumeric("+") == false);
    assert(newIsNumeric("e-") == false);
    assert(newIsNumeric("e+") == false);
    assert(newIsNumeric(".f") == false);
    assert(newIsNumeric("e+f") == false);
}




/*  SOME OLDS TESTS

    auto a = regex(`(nan(i|\+nani)?)|((\+|-)?((inf)|(((\d{1,3}(_\d{3})+)|\d+){1}(\.\d*)?(e(\+|-)(\d{0,3}))?((ul|u)|([l|f]?[i]?))?)))`,"i");
    
    auto m = match(".", a);   
    
    if(!m.empty)
        writeln("Pre : ", m.pre, "\tHit : ", m.hit, "\tPost : ", m.post);
        
    m = match("10fi", a); 
    
    if(!m.empty)
        writeln("Pre : ", m.pre, "\tHit : ", m.hit, "\tPost : ", m.post);

    m = match("10ul", a);  
    
    if(!m.empty)
        writeln("Pre : ", m.pre, "\tHit : ", m.hit, "\tPost : ", m.post);
    m = match("l", a);  
    
    if(!m.empty)
        writeln("Pre : ", m.pre, "\tHit : ", m.hit, "\tPost : ", m.post);
        
        
    m = match("u", a);  
    
    if(!m.empty)
        writeln("Pre : ", m.pre, "\tHit : ", m.hit, "\tPost : ", m.post);


    m = match("10l", a);  
    
    if(!m.empty)
        writeln("Pre : ", m.pre, "\tHit : ", m.hit, "\tPost : ", m.post);
        
        
    m = match("10i", a);  
    
    if(!m.empty)
        writeln("Pre : ", m.pre, "\tHit : ", m.hit, "\tPost : ", m.post);
        //*/