我正在尝试修改现有的电子邮件正则表达式,以允许字符之间使用一个连字符,与点分隔符完全相同。
^([\w]+(?:\.[\w]+)*(?:\-[\w]+)*){1,64}@((?:[\w]+\.)*\w[\w]{0,64})\.([a-z]{2,7})$
我遇到了订单问题:如果我先使用连字符然后再使用点,那么正则表达式会忽略点前面字符左边的所有内容:
my-cool.email@domain.com
- > my-coo
l.email@domain.com
(不介意空格)。
前两组的最大长度限制为64,但它不起作用,当我输入超过64个字符时它通过正则表达式,并且它是有效的。第三组最大长度为7,并且不会验证它是否更多。
你可以举一个例子:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aa
是个好结果
和
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aa
是一个糟糕的结果。
第一个示例在a
之前和之后有64 @
s,第二个示例有65 a
s
https://regex101.com/r/yO1xH7/3
我也想在@
之后做同样的事情,但这比我想象的要复杂。
有什么建议吗?感谢。
答案 0 :(得分:1)
你把连字符放在哪里犯了一个小错误。这是正确的:
^([\w]+(?:[\.\-][\w]+)*(?:[\w]+)*){1,64}@((?:[\w]+\.)*\w[\w]{0,64})\.([a-z]{2,7})$
我想你不明白,因为你不了解?:
的功能。它是Regex非捕获组。它意味着避免那种模式。