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邮件列表上发布了这个问题.)
在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