正则表达式,用于接受以空格,输入键和分号任意序列分隔的用分号分隔的电子邮件ID

时间:2019-12-17 13:03:45

标签: regex regex-lookarounds

我需要编写一个正则表达式来接受多个用分号分隔的电子邮件ID。 用户在输入某些电子邮件ID后可能会误按空格或输入键,我们的正则表达式也应接受。

我当前的表情是:

^(([a-zA-Z0-9_\-\.])+@(domain1|domain2)\.(com){1,25}(($)|(;+ *\n* *)|(\n*;+)|( *;+ *\n*)|(;+\n* *)||( *\n* *;+ *)|(\n*;+\n*)|( *;+ *$)|( *;+ *(?=[a-zA-Z0-9_\-\.]))))+$
在我看来,正则表达式上面的

确实效率不高。作为一个初学者,我已经介绍了一些解决方案,并根据我的理解将它们组合在一起。

预期输出:

应该匹配:abc@domain1.com <space << space> ; <enter> abc@domain1.com <{{1} }> <space>; abc@domain1.com

(空格,输入和分号的顺序可以不同)。 不能接受其他特殊字符。

在这种情况下有人可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

我无法提供直接答案,但是正如评论者所说,您可以使用分隔符分割字符串,然后验证各个块。 JavaScript中的示例:

function getChunks(str) {
  const separatorsRe = /[\s;]+/g
  return str
    // trim the whitespace from the start
    .replace(/^[\s;]+/, '')
    // trim the whitespace from the end
    .replace(/[\s;]+$/, '')
    // finally, split the rest by the separators.
    .split(separatorsRe);
}
function validateEmail(str) {
  const emailRe = /([a-zA-Z0-9_\-\.])+@(domain1|domain2)\.com/i
  return emailRe.test(str);
}

// test cases
const validEmail = 'a@domain1.com';
const invalidDomain = 'a@domain3.com';

console.log(`Valid email is valid: ${ validateEmail(validEmail) }`);
console.log(`Valid email is valid: ${ validateEmail(invalidDomain) }`);

// test cases with separators

const splitBySpace = '  a@domain1.com    b@domain1.com  ';
const splitBySemiColon = 'a@domain1.com;;;b@domain1.com;;;';
const splitByNewLine = `a@domain1.com
b@domain1.com`;
const splitByAllOfIt =` a@domain1.com
b@domain2.com;; ; 
c@domain1.com
   ;; ;d@domain3.com
   
   `;
   
console.log('Chunks split by space:', getChunks(splitBySpace));
console.log('Chunks split by semiColon:', getChunks(splitBySemiColon));
console.log('Chunks split by newLine:', getChunks(splitByNewLine));
console.log('Chunks split by all and any of it:', getChunks(splitByAllOfIt));

// Now test cases for a validator function

function validateEmails(str) {
  const chunks = getChunks(str);
  for (const chunk of chunks) {
    console.log(`${chunk} is ${ validateEmail(chunk) ? 'valid' : 'invalid' }`);
  }
}

validateEmails(splitBySpace);
validateEmails(splitByAllOfIt);

现在,我想在validateEmails函数中进行更多扩展。例如。您可能想检查重复项。您可能只想取有效值,然后报告无效的值,否则您可能无法基于此值进行整个验证。

您可以根据自己的用例进行调整。

编辑:正如评论中所述,对正则表达式本身没有进行详尽的检查。该示例的目的并不是要解决OP的问题,而只是指出他们可以执行电子邮件验证的一种方式。

答案 1 :(得分:0)

谢谢大家提出的解决方案。 我已经为我的问题写了一个正则表达式:

^(([a-zA-Z0-9_\-\.])+@(domain1|domain2)\.(com){1,25}(($)|(\s*;+\s*)|(\s*;+\s*(?=[a-zA-Z0-9_\-\.]))))+$

,然后在调用validateEmail函数之前,我已经使用trim()函数来避免所有空格和换行符,然后将结果数据传递给validateEmail函数。 它解决了我的问题。

谢谢您的帮助!! :)