正则表达式拒绝第一组的一部分(顺序)

regex rejects part of the first group (order)

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

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

我的顺序有问题:如果我先使用连字符然后使用点,则正则表达式会忽略点之前字符左侧的所有内容:

my-cool.email@domain.com -> my-cool.email@domain.com(不介意空格space).

前两组的最大长度限制是 64,但它不起作用,当我输入超过 64 个字符时它通过正则表达式,并且有效。第三组最大长度为7,超过则不验证。

你可以举个例子:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aa是个不错的结果

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aa 是一个糟糕的结果。

第一个例子在@前后有64as,第二个例子有65as

https://regex101.com/r/yO1xH7/3

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

有什么建议吗?谢谢。

你放连字符的地方有点错误。这是正确的:

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

我猜你不明白是因为你不知道?:的作用。它是 Regex 非捕获组。这是为了避免那里的模式。