You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 21:12:44