【问题标题】:Regular expression for accepting email ids separated by semicolon with any sequence of space,enter key & semicolon用于接受以分号分隔的电子邮件 ID 和任何空格序列的正则表达式,输入键和分号
【发布时间】:2019-12-19 17:22:17
【问题描述】:

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

我现在的表达是:

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

在我的情况下,上面的正则表达式确实效率不高。作为初学者,我参考了一些解决方案,并根据我的理解将它们组合起来。

预期输出:

应该匹配:abc@domain1.comspace>space>;enter>abc@domain1.comspace>enter>; abc@domain1.com

(空格、回车和分号的顺序可以不同)。 不应接受其他特殊字符。

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

【问题讨论】:

  • 出于好奇,您使用的是什么语言?
  • 验证单个电子邮件的正则表达式可能不是您所需要的。使用\s*;[\s;]* 拆分并使用您的编程语言中的专用方法验证每个块。或者如果没有正则表达式。如果您的电子邮件模式应该只匹配非常具体的电子邮件,例如匹配^[a-zA-Z0-9_.-]+@(?:domain1|domain2)\.com$,您可以考虑使用^[a-zA-Z0-9_.-]+@(?:domain1|domain2)\.com(?:\s*;[;\s]*[a-zA-Z0-9_.-]+@(?:domain1|domain2)\.com)*$
  • @Zlatko 我正在使用 reactjs,在填写表单时,用户应在文本框中添加电子邮件 ID,以分号分隔,

标签: regex regex-lookarounds


【解决方案1】:

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

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

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

感谢您的帮助!! :)

【讨论】:

  • (com){1,25} 匹配 com 1 到 25 次。不知道是不是你想要的!
【解决方案2】:

我无法提供直接的答案,但正如评论者所说,您可以通过分隔符拆分字符串,然后验证各个块。 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 函数是您想要进一步扩展的地方。例如。你可能想检查重复项。您可能只想获取有效值,然后报告无效值,或者您可能会因此导致整个验证失败。

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

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

【讨论】:

  • 您是否检查过您对此输入的验证:a@domain1.com;ab@dom.com 只是询问,因为它在我的情况下返回 true。
  • ([a-zA-Z0-9_\-\.])+ 中的括号是多余的。如果要捕获本地部分,请保留它们,但将加号移到右括号内。 (像往常一样,这无法匹配一些完全有效的地址,并且会接受一些不可接受或至少不合理的地址。您想接受foo+bar 并可能拒绝.。显然,这不是一个详尽的列表。)
  • 不,没有检查,我刚刚采用了 OPs 正则表达式,并进一步使用它。无论如何,这是一个概念证明,只是为了指出他们可以解决原始问题的方式。如果您有时间和愿望,请改进示例代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
  • 2019-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多