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

JavaScript split string around emails

本文关键字:拆分 字符串 周围 电子邮件 JavaScript      更新时间:2023-09-26

所以我有这个电子邮件列表:

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

它以字符串的形式出现,有时每行末尾都有一个返回字符,有时没有。我希望能够做的是使用正则表达式从字符串中提取每封电子邮件。

所以我从这里得到了这个正则表达式:

function validateEmail(email) { 
    var re = /^(([^<>()[']''.,;:'s@'"]+('.[^<>()[']''.,;:'s@'"]+)*)|('".+'"))@(('[[0-9]{1,3}'.[0-9]{1,3}'.[0-9]{1,3}'.[0-9]{1,3}'])|(([a-zA-Z'-0-9]+'.)+[a-zA-Z]{2,}))$/;
    return re.test(email);
} 

如何让它匹配许多电子邮件地址并返回给我每封单独的电子邮件?

不想在返回角色上拆分,我不能总是保证该角色会拆分列表。这些电子邮件是从用户剪贴板粘贴的。如果这么简单,我就不会问;)<</p>

div class="answers>

它以字符串形式出现,末尾有一个返回字符 每行。

然后只是在换行符上拆分字符串?

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

这是一个非常简单的方法。

/([^;:<>!?'n]+'@[^;:<>!?'n]+'.[^;:<>!?'n]+)/gmi

解释:

[^;:<>!?'n]匹配除这些字符之外的所有内容。 因此,[^;:<>!?'n]+只是意味着根据需要多次匹配除这些之外的所有内容。

然后匹配@符号。

然后根据需要匹配尽可能多的不是这些([^;:<>!?'n])。

然后匹配文字点 (.)。

然后不要再次匹配这些([^;:<>!?'n])。

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

  1. g的意思是全球性的。 一遍又一遍地匹配这个正则表达式。
  2. m表示多行。 不要停留在电子邮件第一行的末尾。
  3. i意味着麻木不仁。 不用担心大写和小写。

演示在这里: https://regex101.com/r/aC5cK2/1

所以我

重新工作答案以合并@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_REGEXP来自 Angular 源代码。我在其他地方使用它,所以在这里使用它非常合适(一致性)。

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