如何使用Go RE2正则语法创建过滤除.co/.us外的ccTLD邮箱过滤器?
解决方案:兼容Go RE2的ccTLD过滤正则
需求明确
需要匹配邮件发件人@之后的域名部分,筛选出除.co和.us外的所有国家顶级域名(ccTLD,通常为2字母后缀),用于隔离垃圾邮件与恶意软件。由于Go采用RE2正则引擎,不支持零宽断言(前瞻/后顾),需使用兼容语法实现。
最终正则表达式
// 不区分大小写版本,适配邮箱域名的大小写变体 regex := regexp.MustCompile(`(?i)@[a-z0-9.-]+\.(?:[a-df-z][a-z]|c[a-df-z]|u[a-tv-z])`)
正则规则拆解
(?i):开启不区分大小写匹配,避免因域名大小写差异漏匹配@:精准匹配发件人地址中的@分隔符[a-z0-9.-]+:匹配@后的域名主体部分,支持字母、数字、点号和连字符,覆盖多级域名场景(如sub.domain.uk)\.:匹配域名后缀前的点号- 非捕获分组
(?:...)组合排除逻辑:[a-df-z][a-z]:匹配首字母非c/u的2字母后缀(如.uk、.ca)c[a-df-z]:匹配首字母为c但次字母非o的后缀(如.cn、.cu)u[a-tv-z]:匹配首字母为u但次字母非s的后缀(如.au、.uy)
Go代码使用示例
package main import ( "fmt" "regexp" ) func main() { testSenders := []string{ "spammer@example.uk", // 应触发隔离(.uk为ccTLD) "legit@example.co", // 应放行(排除.co) "malware@example.us", // 应放行(排除.us) "user@sub.au", // 应触发隔离(.au为ccTLD) "admin@domain.cn", // 应触发隔离(.cn为ccTLD) } filterRegex := regexp.MustCompile(`(?i)@[a-z0-9.-]+\.(?:[a-df-z][a-z]|c[a-df-z]|u[a-tv-z])`) for _, sender := range testSenders { if filterRegex.MatchString(sender) { fmt.Printf("隔离邮件:%s\n", sender) } else { fmt.Printf("放行邮件:%s\n", sender) } } }
重要提示
- RE2兼容性:本正则完全规避了RE2不支持的零宽断言语法,确保在Go环境中正常运行
- 域名范围调整:若仅需匹配单级域名(如
user@domain.uk而非user@sub.domain.uk),可将[a-z0-9.-]+改为[a-z0-9-]+ - 后缀扩展:如需排除更多ccTLD,可在分组中追加对应规则(如排除
.jp则添加|j[a-ik-z])
内容的提问来源于stack exchange,提问作者TCG_at_PPE
相关产品推荐
相关产品推荐

