только indeхOf() очень медленная...
http://www.jurjans.lv/flash/RegExp.html вот отсюда можно взять regEхp для АС2.
Собственно, в моем варианте нужно было всего 1 строчку добавить =)

Код:
function validateEmail(s:String):Boolean {
if(s.indexOf('..')>=0) return false;
if(s.indexOf('@.')>=0) return false;
var sl:Number = s.length;
var i:Number = 0;
var ss:Number;
var isLocalName:Boolean = true;
var domainName:Boolean = false;
var domainZone1:Boolean = false;
var domainZone2:Boolean = false;
var hasDomainName:Boolean = false;
var hasDomainZone:Boolean = false;
while (i < sl) {
ss = s.charCodeAt(i);
//trace(ss);
switch (ss) {
case -1:
case 33:
case 34:
case 35:
case 36:
case 38:
case 39:
case 40:
case 41:
case 42:
case 43:
case 47:
case 58:
case 59:
case 60:
case 61:
case 62:
case 63:
case 91:
case 92:
case 93:
case 123:
case 124:
case 125:
return false;
case 64:
if (!isLocalName || !i) return false;
isLocalName = false;
hasDomainName = true;
domainName = true;
break;
case 45:
if (!i) return false;
break;
case 46:
if (!i) return false;
if (isLocalName) break;
if (domainName) {
domainName = false;
hasDomainZone = true;
domainZone1 = true;
} else if (domainZone1) {
domainZone1 = false;
domainZone2 = true;
} else {
return false;
}
break;
default:
if (ss > 47 && ss < 122) {
break;
} else {
return false;
}
}
i++;
}
if (hasDomainName && hasDomainZone) return true;
return false;
}
trace(validateEmail('abc.d12-3@hotmail.com'));
Вот, добавил еще тест, если интересно =)

Код:
function checkEmail(e) {
var i, j, l = e.length;
var foundPoint = false;
function checkChars(s, i, l) {
while (i<l && ("_-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789").indexOf(s.charAt(i)) != -1) {
i++;
}
return i;
}
function checkFirstChars(s, i, l) {
while (i<l && ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789").indexOf(s.charAt(i)) != -1) {
i++;
}
return i;
}
function checkFirstLevelDomainChars(s, i, l) {
while (i<l && ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ").indexOf(s.charAt(i)) != -1) {
i++;
}
return (i == l);
}
//trace(e);
// every email starts with a string
if ((i=checkFirstChars(e, 0, l)) == 0) {
return -1;
}
//init j
j = i;
// followed by an arbitrary number of ("." string) combinations
while (i<l && e.charAt(i) == ".") {
// skip the point
i++;
// if there are no chars, we have an error
if ((j=checkChars(e, i, l)) == i) {
return -2;
}
// else skip the chars
i = j;
}
// then follows the magic @
if (e.charAt(i) != "@") {
return -3;
}
if (e.charAt(i+2) == ".") {
return -3;
}
// followed by minimum one string point string
// after the last point minimum 2 characters are allowed
do {
// skip the @ (j == i at the beginning, so it is like i++)
i = j+1;
// do we have more chars ?
j = checkChars(e, i, l);
if (j == i) {
// no more chars found -> error
return -4;
} else if (j == e.length) {
// emailaddress is finished, do we have a first level domain ?
j -= i;
// we have one if it is at least 2 long and consists of the correct characters
if (foundPoint && j>=2 && checkFirstLevelDomainChars(e, i, l) && j<=5) {
return 1;
} else {
return -5;
}
}
// if we reach the end or don't have a point, we return an error
foundPoint = (e.charAt(j) == ".");
} while (i<l && foundPoint);
return -6;
}
//
function validateEmail(s:String):Boolean {
if(s.indexOf('..')>=0) return false;
if(s.indexOf('@.')>=0) return false;
var sl:Number = s.length;
var i:Number = 0;
var ss:Number;
var isLocalName:Boolean = true;
var domainName:Boolean = false;
var domainZone1:Boolean = false;
var domainZone2:Boolean = false;
var hasDomainName:Boolean = false;
var hasDomainZone:Boolean = false;
while (i < sl) {
ss = s.charCodeAt(i);
//trace(ss);
switch (ss) {
case -1:
case 33:
case 34:
case 35:
case 36:
case 38:
case 39:
case 40:
case 41:
case 42:
case 43:
case 47:
case 58:
case 59:
case 60:
case 61:
case 62:
case 63:
case 91:
case 92:
case 93:
case 123:
case 124:
case 125:
return false;
case 64:
if (!isLocalName || !i) return false;
isLocalName = false;
hasDomainName = true;
domainName = true;
break;
case 45:
if (!i) return false;
break;
case 46:
if (!i) return false;
if (isLocalName) break;
if (domainName) {
domainName = false;
hasDomainZone = true;
domainZone1 = true;
} else if (domainZone1) {
domainZone1 = false;
domainZone2 = true;
} else {
return false;
}
break;
default:
if (ss > 47 && ss < 122) {
break;
} else {
return false;
}
}
i++;
}
if(hasDomainName && hasDomainZone) return true;
return false;
}
var eMails:Array = [];
function generateEmails():Void {
var randChar:String = '';
var emailLength:Number = 16;
while(emailLength) {
randChar += String.fromCharCode(Math.round(Math.random()*126));
emailLength--;
}
eMails.push(randChar);
}
for(var t:Number=0; t<1000; t++){
generateEmails();
}
var time:Number = getTimer();
for(var i:Number=0; i<1000; i++){
validateEmail(eMails[i])
}
trace('validateEmail validated 1000 e-mails within '+(getTimer() - time)+' ms');
var time:Number = getTimer();
for(var j:Number=0; j<1000; j++){
checkEmail(eMails[i])
}
trace('checkEmail validated 1000 e-mails within '+(getTimer() - time)+' ms');