如何用正则表达式筛选不含ruba.com域名的邮箱地址
如何用正则表达式筛选域名不为ruba.com的邮箱?
你的需求很明确:从邮箱列表里排除所有域名恰好是ruba.com的邮箱,留下其他所有合法邮箱。先说说你之前写的两个正则为什么行不通:
第一个正则
[a-zA-Z0-9_.+-]+@[^(ruba)]+.[a-zA-Z0-9-.]+
这里的[^(ruba)]是字符组,它的意思是“匹配任意一个不是r、u、b、a、(、)的字符”,而不是“匹配不是ruba这个字符串的内容”。所以像rubd.com里的r、u、b都会被这个字符组拒绝,导致整个邮箱无法匹配,完全不符合你的需求。第二个正则
[a-zA-Z0-9_.+-]+@[^r][^u][^b][^a]+.[a-zA-Z0-9-.]+
这个写法是要求域名的前四个字符分别不能是r、u、b、a,逻辑完全错了。比如你要保留的dgh@rubd.com,它的域名前四个字符是r、u、b、d,第二个字符是u,正好命中[^u]的排除规则,导致这个合法邮箱被错误过滤掉。
正确的正则表达式
我们需要用**负向预查(Negative Lookahead)**来精准排除域名是ruba.com的情况,正则如下:
^[a-zA-Z0-9_.+-]+@(?!ruba\.com$)[a-zA-Z0-9.-]+\.[a-zA-Z0-9-]+$
拆解说明:
^:匹配字符串的开头,确保我们从邮箱的最开始检查[a-zA-Z0-9_.+-]+:匹配邮箱的本地部分(@之前的内容),符合RFC标准的邮箱本地格式@:匹配邮箱必备的@符号(?!ruba\.com$):核心的负向预查,意思是“@后面不能紧跟着ruba.com直到字符串结束”,精准排除域名恰好是ruba.com的情况[a-zA-Z0-9.-]+:匹配域名的主域部分(比如gmail、rubd)\.[a-zA-Z0-9-]+:匹配顶级域名(比如.com),注意这里的.要转义成\.,因为正则里.默认匹配任意字符$:匹配字符串的结尾,确保我们检查的是完整的邮箱地址
验证你的例子:
ads@gmail.com:匹配成功(域名不是ruba.com)dgh@rubd.com:匹配成功(域名不是ruba.com)ert@ruba.com:匹配失败(域名正好是ruba.com,被预查排除)
完全符合你的需求!
内容的提问来源于stack exchange,提问作者Deba




