._-,不可以特殊字元開頭/結尾user.name@domain.com、user_name@sub.domain.cn、user-name@domain.co.ukconst emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
說明:
^[a-zA-Z0-9._%+-]+:本地部份,允許常見特殊字元@:必須單一 @[a-zA-Z0-9.-]+:域名標籤(含子域名)\.[a-zA-Z]{2,}$:頂級域至少 2 字母function isValidEmail(email) {
if (typeof email !== 'string') return false;
const regex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
return regex.test(email.trim());
}
// 測試
['test@hotmail.com', 'user@sub.domain.cn', 'invalid@', '@domain.com', 'user@domain'].forEach(e =>
console.log(e, '→', isValidEmail(e))
);
// 過於複雜,僅供參考
const rfc5322Regex = /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$/i;
+ 號、長 TLD)IDN 轉碼