On 2/5/2018 9:35 PM, Dmitry Olshansky wrote:
That’s really bad idea - isEmail is template so the burden of freaking slow 
ctRegex
is paid on per instantiation basis. Could be horrible with separate compilation.

std.string.isEmail() in D1 was a simple function. Maybe regex is just the wrong solution for this problem.

---------------------- std.string.isEmail --------------------

/***************************
 * Does string s[] start with an email address?
 * Returns:
 *      null    it does not
 *      char[]  it does, and this is the slice of s[] that is that email address
 * References:
 *      RFC2822
 */
char[] isEmail(char[] s)
{   size_t i;

    if (!isalpha(s[0]))
        goto Lno;

    for (i = 1; 1; i++)
    {
        if (i == s.length)
            goto Lno;
        auto c = s[i];
        if (isalnum(c))
            continue;
        if (c == '-' || c == '_' || c == '.')
            continue;
        if (c != '@')
            goto Lno;
        i++;
        break;
    }
    //writefln("test1 '%s'", s[0 .. i]);

    /* Now do the part past the '@'
     */
    size_t lastdot;
    for (; i < s.length; i++)
    {
        auto c = s[i];
        if (isalnum(c))
            continue;
        if (c == '-' || c == '_')
            continue;
        if (c == '.')
        {
            lastdot = i;
            continue;
        }
        break;
    }
    if (!lastdot || (i - lastdot != 3 && i - lastdot != 4))
        goto Lno;

    return s[0 .. i];

Lno:
    return null;
}

Reply via email to