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

Email validation regex takes a long time to complete on medium-long strings

返回 true 或 false 后:

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

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

一般来说,较短的字符串用时不到 1 秒。

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

您可以使用此 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})(\]?)$/;

在每个 [.-]:

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

regex demo

([.-]?\w+)*中,[.-]?匹配出现1次或0次的.-,整个组模式在之后减少为(\w+)* \w+,导致回溯冗余步骤过多

此外,如果您仅使用分组构造来量化一组子模式,那么使用非捕获组是个好主意。

现在,关于

it must have letter(s) then @ then letter(s) then . then letter(s) and must not be too long

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

我建议在 HTML5 pattern 属性中使用模式,并限制用户可以使用 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>

注意pattern 正则表达式是通过用 ^(?:)$ 括起模式来编译的,你不需要在此处的正则表达式中使用 ^$。所以,pattern="\S+@\S+\.\S+"被翻译成:

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

这是今天发出的 RFC 2822 Standrard for matching emails. It can 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.

的其中一个答案

只需使用

\S+@\S+

甚至(带锚点)

^\S+@\S+$

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

将 ()* 替换为 ()? PS: 非常奇怪的表达式来匹配电子邮件:)

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

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

它很短,几乎可以匹配任何电子邮件,但不会匹配:

abc@abc

其他一些答案可能如此。