求助:GO语言的正则表达式问题

我写了一个正则表达式”^((?!等于).)$“,目的是让字符串任何位置有“等于”不匹配,用的是系统regexp包。
reg := regexp.MustCompile(“^((?!等于).)$”)
运行时报错:
$Compile(`^((?!等于).)
$): error parsing regexp: invalid or unsupported Perl syntax:(?!`
请问一下这是什么原因,不用第三方正则包,有没有好的解决办法。

共 6 个回复


David

试试^([^等]*等[^于])*[^等]*等?$这个正则表达式。

# 1

fising

反过来写,如果匹配了 等于,如何;否则如何。这要就避开这个问题了。

最简单的,直接 strings.Contains(s, substring) 不也行么?

# 2

snake117

go永远都不会支持这种语法。

因为开发团队说了,go的正则表达式首要关注的就是效率,号称go自家的正则表达式可以和经典DFA的正则实现媲美。

所以perl这种明显是NFA特有的功能,go虽然会努力实现,但是如果影响效率就不会加入进去。

# 3

xi11xi19

@smartwalle 感谢你的解答,原因大概是官方正则包不支持时间复杂度太高的语法,看了下源码,的确没有解析预查功能的符号。
@David 你的正则表达式非常巧妙,我已经用上了,并把这个正则扩展到排除多个两位汉字。排除任意一段字符串还得研究下,非常感谢。
@fising 前面考虑过这个问题,服务器端已经写死了,这个正则是需要写到数据库,服务器来读取,改服务器代码没考虑,感谢你的解答。
@snake117 我用第三方正则包试过,效率的确很低,感谢你的解答,让我对go进一步了解。

# 4

gutianyun

题主的正则本身也是错误的吧!!!!为什么没有人提出来?

sa=['hah','哈哈','不等于','哈']
for s in sa:
print(re.match(r'^((?!等于).)$',s))
print("第二个正则")
for s in sa:
print(re.match(r'^([^等]等[^于])[^等]*等?$',s))

re.sub(r'后面(?!我)','后面被替换','我后面 我后面')

# 5