正则表达式 - 验证电子邮件的本地部分不是以点结尾,而只允许某些字符而不使用后瞻

时间:2018-04-24 21:18:46

标签: javascript regex regex-lookarounds

我使用lookbehind在@之前检查一个点,但只是意识到并非所有浏览器都支持lookbehinds。它在Chrome中运行良好,但在Firefox和IE中失败。

这就是我想出来的,但它肯定是凌乱的

^([a-zA-Z0-9&^*%#~{}=+?`_-]\.?)*[a-zA-Z0-9&^*%#~{}=+?`_-]@([a-zA-Z0-9]+\.)+[a-zA-Z]$

有更简单和/或更优雅的方法吗?我不认为我可以否定点(^。),因为我只允许某些字符存在于本地部分。

1 个答案:

答案 0 :(得分:1)

([a-zA-Z0-9&^*%#~{}=+?`_-].?)*[a-zA-Z0-9&^*%#~{}=+?`_-]部分并不凌乱,但效率低下,因为*量化了包含必填部分[...]和可选\.?的群组。而不是(ab?)*a,您可以使用a+(?:ba+)*来匹配线性和快速,在您的情况下,[a-zA-Z0-9&^*%#~{}=+?`_-]+(?:.[a-zA-Z0-9&^*%#~{}=+?`_-]+)*

更多,[a-zA-Z0-9_]等于JS正则表达式中的\w,您可以使用它来缩短模式。

此外,最后一个[a-zA-Z]$模式只匹配一个字母,您最有可能需要[a-zA-Z]{2}$,因为顶级域名包含2个以上的字母。

所以,你可以使用

^[\w&^*%#~{}=+?`-]+(?:\.[\w&^*%#~{}=+?`-]+)*@(?:[a-zA-Z0-9]+\.)+[a-zA-Z]{2,}$

请参阅regex demo