我需要编写一个正则表达式来接受多个用分号分隔的电子邮件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
(空格,输入和分号的顺序可以不同)。 不能接受其他特殊字符。
在这种情况下有人可以帮助我吗?
答案 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函数。 它解决了我的问题。
谢谢您的帮助!! :)