使用JavaScript获取字符串中的所有电子邮件地址

时间:2010-05-06 08:06:05

标签: javascript regex validation

所以,我有这个JavaScript函数:

ME.Utils = {
    RxEmail: new RegExp(/^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i),

    ValidateEmail: function(email) {
        return ME.Utils.RxEmail.test(email);
    },

    GetEmailAddresses: function(text) {
        return text.match(ME.Utils.RxEmail);
    },

    HasEmail: function(text) {
        return ME.Utils.GetEmailAddresses != null;
    }
};

ValidateEmail效果很好。但是,HasEmailGetEmailAddresses无效。

GetEmailAdresses始终返回null,但字符串仅包含电子邮件地址时除外。在这种情况下,GetEmailAdresses返回的数组不仅包含电子邮件地址,还包含电子邮件地址(test@test.com),只是id(测试)加上一些未识别的等等...

你能帮我弄清楚我的表情有什么不对吗?

4 个答案:

答案 0 :(得分:4)

有一些问题。

  1. 您的正则表达式锚定在字符串的开头和结尾。您应该从中删除^$个字符。

  2. 如果您只想返回电子邮件地址,请使用非捕获组。

  3. HasEmail()中,您没有致电GetEmailAddresses()。您实际上正在检查是否已定义该属性的值。

  4. 总而言之,固定版本可能如下所示:

    ME.Utils = {
        RxEmail: /(?:(?:"[\w-\s]+")|(?:[\w-]+(?:\.[\w-]+)*)|(?:"[\w-\s]+")(?:[\w-]+(?:\.[\w-]+)*))(?:@(?:(?:[\w-]+\.)*\w[\w-]{0,66})\.(?:[a-z]{2,6}(?:?:\.[a-z]{2})?))|(?:@\[?(?:(?:25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))(?:(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?)/gi,
    
        ValidateEmail: function(email) {
            // We can't do a simple test() since we're using an unanchored regex now.
            var match = ME.Utils.RxEmail.match(email);
            return match.length == 1 && match[0] == email;
        },
    
        GetEmailAddresses: function(text) {
            return text.match(ME.Utils.RxEmail);
        },
    
        HasEmail: function(text) {
            return ME.Utils.GetEmailAddresses(text) != null;
        }
    };
    

答案 1 :(得分:2)

你的正则表达式专门匹配整个字符串

RxEmail: new RegExp(/^ ... $)/i),

^和$分别匹配输入的开始和结束。尝试删除这些字符,看看你是如何进行的?

答案 2 :(得分:1)

if (emailMatch = ME.Utils.GetEmailAddresses(myEmail))
  // do stuff with emailMatch[1]

答案 3 :(得分:1)

当您使用电子邮件地址呈现数组中的多个条目时,您的表达式中包含捕获组。在Javascript中,匹配的结果是一个数组,其中索引0是匹配的总字符串,然后(每个捕获组)有(可选)附加索引。您可以将群组从(...)更改为(?:...)

,从而使群组无法捕获

至于为什么在使用GetEmailAddresses字符串包含电子邮件地址时,您没有得到预期结果,请尝试以下方法:

GetEmailAddresses: function(text) {
    var rv = [];
    var match;

    while (match = ME.Utils.RxEmail.exec(text)) {
        rv.push(match[0]);
    }
    return rv.length == 0 ? null : rv;
},

请参阅此question and answer,我不能说我知道为什么 String#match与上面的RegExp#exec循环不完全相同,但它不是“T

修改您还需要修复oedo pointed out的问题;需要允许RegExp匹配子串。