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; }