mgo正则表达式不起作用

Mel*_*kor 4 regex go mongodb unicode-escapes mgo

现在我有一些文件,其中的每一个都有一个键path像和值\A\,\B\,\A\C\,\A\C\D\,\A\E\,\A\E\F\.

我想找到只有1段的那些.这意味着结果应该是\A\\B\.我使用正则表达式/^\\[^\\]*\\$/,它在MongoDB终端中工作正常.但是,当我尝试将它应用于Go程序时,它不起作用.

转码:

var nodeList []NodeEntry // NodeEntry would match every field of one document
err = c.Find(bson.M{"path": bson.M{"$regex": bson.RegEx{"^\\[^\\]*\\$", ""}}}).All(&nodeList)
fmt.Println(nodeList)
Run Code Online (Sandbox Code Playgroud)

输出:

[]
Run Code Online (Sandbox Code Playgroud)

这很奇怪,然后我发现任何正则表达式\\都会产生空结果.

这是一个mgo的错误吗?

(我不知道这是不合适的,但我也在mgo.users邮件列表上发布了这个问题.)

ANi*_*sus 6

在Go中,反斜杠(\)是解释的字符串文字的转义字符(使用"..."作为附件).在您的情况下,您宁愿使用原始字符串文字(使用`...`作为附件).

我们来看看这段代码:

package main

import "fmt"

func main() {
    fmt.Println("^\\[^\\]*\\$")
    fmt.Println(`^\\[^\\]*\\$`)
}
Run Code Online (Sandbox Code Playgroud)

结果:

^\[^\]*\$
^\\[^\\]*\\$
Run Code Online (Sandbox Code Playgroud)

您可以看到它是您想要的正则表达式字符串的第二个选项.因此,要解决您的问题,只需将正则表达式字符串用反引号而不是引号括起来:

err = c.Find(bson.M{"path": bson.M{"$regex": bson.RegEx{`^\\[^\\]*\\$`, ""}}}).All(&nodeList)
Run Code Online (Sandbox Code Playgroud)

请参阅规范参考: http ://golang.org/ref/spec#String_literals