正则表达式拒绝第一组的一部分(订单)

时间:2016-04-19 01:11:06

标签: regex validation match email-validation regex-lookarounds

我正在尝试修改现有的电子邮件正则表达式,以允许字符之间使用一个连字符,与点分隔符完全相同。

^([\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

我也想在@之后做同样的事情,但这比我想象的要复杂。

有什么建议吗?感谢。

1 个答案:

答案 0 :(得分:1)

你把连字符放在哪里犯了一个小错误。这是正确的:

^([\w]+(?:[\.\-][\w]+)*(?:[\w]+)*){1,64}@((?:[\w]+\.)*\w[\w]{0,64})\.([a-z]{2,7})$

我想你不明白,因为你不了解?:的功能。它是Regex非捕获组。它意味着避免那种模式。