电子邮件验证正则表达式需要很长时间才能完成中长字符串

时间:2017-10-24 13:53:54

标签: javascript regex backtracking

返回true或false后:

return (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,8})+$/.test(str));

其中str是testing123@testing123.testing123 完成大约需要25秒。

通常,较短的字符串不到1秒钟。

这很可能是由于回溯。我对Regex不是很了解,有人可以帮助我减少处理电子邮件所需的时间。例如。它必须有字母然后@然后字母。然后是字母,不能太长。

6 个答案:

答案 0 :(得分:3)

只需使用

\S+@\S+

甚至(带锚点)

^\S+@\S+$

并且实际上向该地址发送电子邮件,而不是使用复杂的,可能容易出错的表达式。

答案 1 :(得分:1)

在每个?后删除[.-]

/^\w+(?:[.-]\w+)*@\w+(?:[.-]\w+)*(?:\.\w{2,8})+$/

请参阅regex demo

([.-]?\w+)*中,[.-]?匹配.-的1或0次匹配,并且(\w+)*之后整个组模式减少到\w+ 1}},它导致了太多的冗余回溯步骤。

此外,如果您仅使用分组构造来量化一组子模式,则最好使用非捕获组。

现在,关于

  

它必须有字母,然后是@然后是字母。然后是字母,不能太长

我看到其他人建议使用^\S+@\S+\.\S+$类似解决方案,这是一个好主意,只需确保您了解\S匹配除空白之外的任何字符(不仅仅是字母) 。此外,这实际上并没有提供最终的解决方案,因为"不能太长"条件不满足(+匹配从1到很多次出现,这就是为什么它被描述为 1或更多)。

我建议在HTML5 模式属性中使用模式,并限制用户可以使用maxlength属性键入的字符数:



input:valid {
  color: black;
}
input:invalid {
  color: red;
}

<form name="form1"> 
 <input pattern="\S+@\S+\.\S+" maxlength="256" title="Please enter an email address like name@myhost.com!" placeholder="name@myhost.com"/>
 <input type="Submit"/> 
</form>
&#13;
&#13;
&#13;

注意模式正则表达式是通过用^(?:)$封闭模式来编译的,您不需要使用{{1这里和正则表达式中的^$。因此,pattern="\S+@\S+\.\S+"被翻译为:

  • ^(?:(由HTML5添加) - 字符串的开头(以及非捕获组的开始)
  • \S+ - 任何一个或多个非空白字符
  • @ - @字符
  • \S+ - 任何一个或多个非空白字符
  • \. - 一个点
  • \S+ - 任何一个或多个非空白字符
  • )$(由HTML5添加) - 非捕获组结束,字符串结尾匹配。

答案 2 :(得分:1)

这是匹配电子邮件的RFC 2822 Standrard。它今天可以发送match 99.9%封电子邮件。

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

如果您只想捕获语法错误,可以使用

\S+@\S+

取自another question.

的答案之一

答案 3 :(得分:0)

您可以使用此Regex查看电子邮件:

var emailregex = /^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/;

答案 4 :(得分:0)

用()替换()*? PS:匹配电子邮件的奇怪表达:)

答案 5 :(得分:0)

匹配电子邮件的有效方法是:

\S+@\S+\.\S+

它很短,几乎与任何电子邮件匹配,并且不匹配:

abc@abc

正如其他一些答案所述。