通过Java的RegEx逐步验证电子邮件地址

时间:2018-11-12 23:59:51

标签: javascript regex

我想对电子邮件地址进行渐进验证。我的意思是说,我想验证一下,因为一次为一个字符串提供一个字符,所以当前字符串是否代表电子邮件地址的有效开始

请注意,我知道this和其他类似的答案,它们为匹配完整的电子邮件地址提供了出色的模式。我要寻找的内容略有不同。

我想知道,给定一个正则表达式模式,说一下下面的模式,如上面的链接所述,是否有一种通用的方法可以说给定的字符串是否表示该模式的有效开头。

/^(([^<>()\[\]\\.,;:\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,}))$/

我知道我可以手动将上述模式分解为复合部分,然后将它们“或”在一起,以便从主模式的开头开始进行更长的模式捕获,但是我希望有一些更优雅的东西和/或稍微冗长一些,可以仅将已建立的模式作为捕获组,并在内部仅查找开始的部分匹配。用正则表达式可以实现吗?

正则表达式将匹配的字符串:

  • “”
  • “测试”
  • “ test.user”
  • “测试用户”。
  • “ test.user.1 @”
  • “ test.user.1@test”
  • “ test.user.1@test.best”
  • “ test.user.1@test.best.com”

正则表达式将匹配的字符串:

  • “ @#$ @#”
  • “测试..”
  • “ test.user。@”
  • “ test.user.1 @@”
  • “ test.user.1 @ test..best”
  • “ test.user.1@test.best @”

1 个答案:

答案 0 :(得分:3)

我正在将电子邮件模式简化为/^[a-z]+(\.[a-z]+)*@[a-z]+(\.[a-z]+)+$/,以简化方法的步骤。

  1. 您确定一种使用模式输入有效值的方案:
Value             regex                                     matches
----------------- ----------------------------------------- ---------
t                 /^[a-z]+/                                 Yes
to                /^[a-z]+/                                 Yes
tom               /^[a-z]+/                                 Yes
tom.              /^[a-z]+\./                               Yes
tom.e             /^[a-z]+(\.[a-z]+)*/                      Yes
tom.ed            /^[a-z]+(\.[a-z]+)*/                      Yes
tom.ed@           /^[a-z]+(\.[a-z]+)*@/                     Yes
tom.ed@i          /^[a-z]+(\.[a-z]+)*@[a-z]+/               Yes
tom.ed@in         /^[a-z]+(\.[a-z]+)*@[a-z]+/               Yes
tom.ed@int        /^[a-z]+(\.[a-z]+)*@[a-z]+/               Yes
tom.ed@inte       /^[a-z]+(\.[a-z]+)*@[a-z]+/               Yes
tom.ed@inter      /^[a-z]+(\.[a-z]+)*@[a-z]+/               Yes
tom.ed@inter.     /^[a-z]+(\.[a-z]+)*@[a-z]+\./             Yes 
tom.ed@inter.n    /^[a-z]+(\.[a-z]+)*@[a-z]+(\.[a-z]+)+/    Yes
tom.ed@inter.ne   /^[a-z]+(\.[a-z]+)*@[a-z]+(\.[a-z]+)+/    Yes
tom.ed@inter.net  /^[a-z]+(\.[a-z]+)*@[a-z]+(\.[a-z]+)+$/   Yes
  1. 然后,您将寻找一种方法来组合仅与前一行匹配1行的模式。

    • 对于/^[a-z]+\./,我们可以将其与/^[a-z]+/合并以获得/^[a-z]+\.?/
    • 对于/^[a-z]+(\.*[a-z]+)*@/,我们可以将其与/^[a-z]+(\.*[a-z]+)*/合并以获得/^[a-z]+(\.*[a-z]+)*@?/
    • 对于/^[a-z]+(\.*[a-z]+)*@[a-z]+\./,我们可以将其与/^[a-z]+(\.*[a-z]+)*@[a-z]+/合并以获得/^[a-z]+(\.*[a-z]+)*@[a-z]+\.?/
    • ...

您继续进行,直到对所有可能的情况都满意为止。

  1. 您使用此/^( ... | ... | ... | ... )/将所有内容放在一起。这是您可能会得到的正则表达式:

/^([a-z]+\.?|[a-z]+(\.[a-z]+)*\.?|[a-z]+(\.[a-z]+)*@|[a-z]+(\.[a-z]+)*@[a-z]+\.?|[a-z]+(\.[a-z]+)*@[a-z]+(\.[a-z]+)*\.?|[a-z]+(\.[a-z]+)*@[a-z]+(\.[a-z]+)+)$/

她是一个更好的观点:

( [a-z]+\.?
| [a-z]+(\.[a-z]+)*\.?
| [a-z]+(\.[a-z]+)*@
| [a-z]+(\.[a-z]+)*@[a-z]+\.?
| [a-z]+(\.[a-z]+)*@[a-z]+(\.[a-z]+)*\.?
| [a-z]+(\.[a-z]+)*@[a-z]+(\.[a-z]+)+ )
  1. 最后一次测试,看看是否会允许不想要的值

您可以在regex101.com或测试页中进行操作。

注意:仅当用户输入值时,此模式才有用。提交之前,必须使用原始模式(/^[a-z]+(\.[a-z]+)*@[a-z]+(\.[a-z]+)+$/)来验证该值,以便不会将任何不完整的值发送到服务器。

编辑: 要使其更具可读性和可维护性,您可以

var patt1 = "[a-z]+\.?";
var patt2 = "[a-z]+(\.[a-z]+)*@";
var patt3 = "[a-z]+(\.[a-z]+)*@[a-z]+\.?";
var patt4 = "[a-z]+(\.[a-z]+)*@[a-z]+(\.[a-z]+)*\.?";
var patt5 = "[a-z]+(\.[a-z]+)*@[a-z]+(\.[a-z]+)+";

var keypressedValidator = new RegExp("^("+patt1+"|"+"+patt2+"|"+"+patt3+"|"+"+patt4+"|"+"+patt5+")$");

...

var inputValue = document.getElementById(...some Id...).value;

if ( ! inputValue.match(keypressedValidator)) {
  ... show error status or error message ...
...