JavaScript在电子邮件周围拆分字符串

JavaScript在电子邮件周围拆分字符串,javascript,regex,email,Javascript,Regex,Email,因此,我有以下电子邮件列表: john.doe@doe.com john.doe@doe.com john.doe@doe.com john.doe@doe.com john.doe@doe.com john.doe@doe.com john.doe@doe.com john.doe@doe.com 它以字符串的形式出现,有时每行末尾都有一个返回字符,有时则没有。我想要做的就是使用正则表达式从字符串中取出每封电子邮件 我从以下地方得到了这个正则表达式: 功能验证电子邮件(电子邮件){ 变量re

因此,我有以下电子邮件列表:

john.doe@doe.com
john.doe@doe.com
john.doe@doe.com
john.doe@doe.com
john.doe@doe.com
john.doe@doe.com
john.doe@doe.com
john.doe@doe.com
它以字符串的形式出现,有时每行末尾都有一个返回字符,有时则没有。我想要做的就是使用正则表达式从字符串中取出每封电子邮件

我从以下地方得到了这个正则表达式:

功能验证电子邮件(电子邮件){
变量re=/^([^()[\]\\,;:\s@\“]+(\.[^()[\]\,;:\s@\“]+)*)(\'+\”)(\[[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[1,3}.[0-9]{1,3}.];
返回重新测试(电子邮件);
} 
我如何让它匹配多个电子邮件地址并将每个电子邮件返回给我

我不想在返回字符上拆分,我不能总是假设是该字符将拆分列表。这些电子邮件是从用户剪贴板粘贴的。如果有那么简单,我就不会问了;)

它以字符串的形式出现,在结尾处有一个返回字符 每行

然后在换行符上拆分字符串

var email_array = str.split("\n");
它以字符串的形式出现,在结尾处有一个返回字符 每行

然后在换行符上拆分字符串

var email_array = str.split("\n");

因此,我重新设计了答案,以纳入@adeneo所说的内容:

$scope.pasteThis = function(e) {
    var emails = e.clipboardData.getData('text/plain');

    var emailArray = emails.split(/(\n|\s|,)/);

    angular.forEach(emailArray, function (e) {
        var EMAIL_REGEXP = /^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i;

        if (EMAIL_REGEXP.test(e)) {
            if (!contains($scope.emailAddresses, e)) {
                $scope.emailAddresses.push(e);
            }
        }
    });
}

function contains(arr, el) {
    var found = false;
    angular.forEach(arr, function(e) {
        if (e == el) {
            found = true;
        }
    });

    return found;
}
因此,
EMAIL\u REGEXP
来自Angular源代码。我在其他地方使用它,所以在这里使用它是非常合适的(一致性)


此功能确保邮件拆分后,每个邮件都是有效的电子邮件地址。这意味着没有任何混乱可以通过。

因此我重新研究了答案,以纳入@adeneo所说的内容:

$scope.pasteThis = function(e) {
    var emails = e.clipboardData.getData('text/plain');

    var emailArray = emails.split(/(\n|\s|,)/);

    angular.forEach(emailArray, function (e) {
        var EMAIL_REGEXP = /^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i;

        if (EMAIL_REGEXP.test(e)) {
            if (!contains($scope.emailAddresses, e)) {
                $scope.emailAddresses.push(e);
            }
        }
    });
}

function contains(arr, el) {
    var found = false;
    angular.forEach(arr, function(e) {
        if (e == el) {
            found = true;
        }
    });

    return found;
}
因此,
EMAIL\u REGEXP
来自Angular源代码。我在其他地方使用它,所以在这里使用它是非常合适的(一致性)


此功能确保邮件拆分后,每个邮件都是有效的电子邮件地址。这意味着没有混乱可以通过。

这里有一个非常简单的方法

/([^;:!?\n]+\@[^;:!?\n]+\.[^;:!?\n]+)/gmi

说明:
[^;:!?\n]
匹配除这些字符以外的所有字符。所以,
[^;:!?\n]+
只意味着匹配所有内容,但根据需要匹配多次

然后匹配一个
@
符号

然后,根据需要再次匹配尽可能多的非匹配项(
[^;:!?\n]

然后匹配一个文字点(.)

然后不再匹配这些(
[^;:!?\n]

末尾的
gmi
s称为标志。他们的意思是:

  • g
    表示全球。反复匹配这个正则表达式
  • m
    表示多行。不要在第一行邮件的末尾停下来
  • i
    表示不敏感。不要担心大小写

  • 这里的演示:

    这里有一个非常简单的方法

    /([^;:!?\n]+\@[^;:!?\n]+\.[^;:!?\n]+)/gmi

    说明:
    [^;:!?\n]
    匹配除这些字符以外的所有字符。所以,
    [^;:!?\n]+
    只意味着匹配所有内容,但根据需要匹配多次

    然后匹配一个
    @
    符号

    然后,根据需要再次匹配尽可能多的非匹配项(
    [^;:!?\n]

    然后匹配一个文字点(.)

    然后不再匹配这些(
    [^;:!?\n]

    末尾的
    gmi
    s称为标志。他们的意思是:

  • g
    表示全球。反复匹配这个正则表达式
  • m
    表示多行。不要在第一行邮件的末尾停下来
  • i
    表示不敏感。不要担心大小写


  • 这里的演示:

    为什么不干脆
    str.split(“\n”)
    ?或者用
    替换
    “\n”
    s请参阅更新以了解更多信息如何用您选择的单个空格替换任意数量的空格?@Terry我刚刚回答了我的问题,为什么不直接使用
    str.split(“\n”)
    ?或将
    “\n”
    s替换为
    查看更新以了解更多信息如何用您选择的单个空格替换任意数量的空格?@Terry我刚刚回答了我的问题如果它不是返回字符,如果它只是一个分隔它们的空格怎么办?我不知道电子邮件地址是怎么来的,这就是为什么我不能在
    \n
    上拆分的原因,因为这样做不够安全,然后在空格、换行符、逗号和任何可以拆分的
    str.split(/(\n |\s |,)/)
    上拆分。将电子邮件与正则表达式匹配是复杂的,您会失败。例如,您的正则表达式在
    @example.com
    中失败,这是一个有效的电子邮件等。空格失败:
    ImaFool@example.com
    ,特殊字符将失败:
    name@bløff.se
    和其他一些字符。如果它不是返回字符,如果它只是一个分隔它们的空格呢?我不知道电子邮件地址是怎么来的,这就是为什么我不能在
    \n
    上拆分的原因,因为这样做不够安全,然后在空格、换行符、逗号和任何可以拆分的
    str.split(/(\n |\s |,)/)
    上拆分。将电子邮件与正则表达式匹配是复杂的,您会失败。例如,您的正则表达式在
    @example.com
    中失败,这是一个有效的电子邮件等。空格失败:
    ImaFool@example.com
    ,特殊字符将失败:
    name@bløff.se
    和其他一些人。先生,这是一个很棒的答案!我将在新的一年里尝试一下。谢谢:)@Callumlington,如果我的答案对你有用,请接受我的答案:)很乐意帮忙!先生,这是一个很棒的回答!我将在新的一年里尝试一下。谢谢:)@Callumlington,如果我的答案对你有用,请接受我的答案:)很乐意帮忙!