电子邮件验证正则表达式需要很长时间才能完成中等长度的字符串
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})+$/
在([.-]?\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
其他一些答案可能如此。
返回 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})+$/
在([.-]?\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
其他一些答案可能如此。