我使用lookbehind在@之前检查一个点,但只是意识到并非所有浏览器都支持lookbehinds。它在Chrome中运行良好,但在Firefox和IE中失败。
这就是我想出来的,但它肯定是凌乱的
^([a-zA-Z0-9&^*%#~{}=+?`_-]\.?)*[a-zA-Z0-9&^*%#~{}=+?`_-]@([a-zA-Z0-9]+\.)+[a-zA-Z]$
有更简单和/或更优雅的方法吗?我不认为我可以否定点(^。),因为我只允许某些字符存在于本地部分。
答案 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。