Go语言负向前瞻等价正则实现:匹配非指定后缀字符串
在Go中实现匹配不以指定域名结尾的字符串
Go标准库的regexp包确实不支持PCRE风格的负向前瞻,但完全可以通过两种方式实现你要的需求,等价于^(?!.*@abcdefghijk\.com$)的效果:
方法一:反向匹配(更直观)
先编译一个匹配以@abcdefghijk.com结尾的正则,然后判断目标字符串是否不匹配这个正则。这种方式逻辑简单,容易理解和维护:
package main import ( "fmt" "regexp" ) func main() { // 定义要排除的后缀 bannedSuffix := "@abcdefghijk.com" // 编译匹配该后缀结尾的正则 re := regexp.MustCompile(bannedSuffix + "$") testStrings := []string{ "alice@example.com", "bob@abcdefghijk.com", "charlie@abcdefghijk.com.cn", "david", } for _, s := range testStrings { if !re.MatchString(s) { fmt.Printf("符合要求:%s\n", s) } else { fmt.Printf("不符合要求:%s\n", s) } } }
方法二:使用负向后瞻直接匹配
Go支持固定长度的负向后瞻,而@abcdefghijk.com是固定长度的字符串,所以可以直接写正则断言字符串结尾之前不是这个后缀:
package main import ( "fmt" "regexp" ) func main() { // 正则含义:匹配任意字符串,且结尾前不是@abcdefghijk.com re := regexp.MustCompile(`^.*(?<!@abcdefghijk\.com)$`) testStrings := []string{ "alice@example.com", "bob@abcdefghijk.com", "charlie@abcdefghijk.com.cn", "david", } for _, s := range testStrings { if re.MatchString(s) { fmt.Printf("符合要求:%s\n", s) } else { fmt.Printf("不符合要求:%s\n", s) } } }
两种方法对比
- 方法一逻辑清晰,当需要修改排除的后缀时,只需调整
bannedSuffix变量,无需修改正则,适合日常开发。 - 方法二直接通过正则完成匹配,适合必须用单个正则表达式的场景(比如配置文件中的规则)。
内容的提问来源于stack exchange,提问作者Mitchel Sarauer
相关产品推荐
相关产品推荐

