【问题标题】:mgo regular expression doesn't workmgo 正则表达式不起作用
【发布时间】:2014-05-24 13:18:36
【问题描述】:

现在我有一些文档,每个文档都有一个键 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)

输出:

[]

太奇怪了,然后我发现任何带有\\的Regex都会产生一个空结果。

难道是mgo的bug?

(不知道是不是不合适,不过我也把这个问题发到mgo.users mailing list了。)

【问题讨论】:

  • 尝试使用\\` or \\\`,因为其他一些语言在将它们放在字符串""中时以这种方式支持
  • @SabujHassan 对不起,是编辑器的问题吗?我真的不知道你想说什么。

标签: regex mongodb go mgo unicode-escapes


【解决方案1】:

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

我们来看这段代码:

package main

import "fmt"

func main() {
    fmt.Println("^\\[^\\]*\\$")
    fmt.Println(`^\\[^\\]*\\$`)
}

结果:

^\[^\]*\$
^\\[^\\]*\\$

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

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

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

【讨论】:

  • 是的,它可以工作,但是如果我希望我的正则表达式是一些与字符串变量连接的字符串呢?比如我已经有一个字符串变量,其值为\A\ ,我想找到path有2个段,即\A\C\ \A\E\ ,所以正则表达式应该是`^`+variable+`[^\\]*\\$`,但实际上在@里面987654331@,是\A\ ,不是\\A\\ ,在前端和尾部手动加一个\ 是不行的。我尝试用\\ 替换\ ,但还是不行。
  • 哦,对不起,我弄错了。如果我将\ 替换为\\ ,效果会很好。但是还是有点奇怪,因为我在mongodb中存储的不是\\ 而是\ ,那我为什么要使用\\ 才能找到呢?
  • @Melkor:您需要使用\\ ,因为 perl 风格的正则表达式也使用反斜杠作为转义字符。因此,在正则表达式中,\\ 表示 the character \ ,与 \. 表示 the character . 不同,. 表示 any character
  • 是的我明白了,后来我发现为了匹配\ ,我需要通过\\\\ \\\\ 在 golang 中会被翻译成\\ \\ 在正则表达式搜索查询中会被翻译成\
【解决方案2】:

添加到@sandun-priyanka 解决方案,如果你想让它不区分大小写:

selector:= bson.M{"title": bson.M{"$regex": `(?i)`+wordOffset}}

【讨论】:

    【解决方案3】:

    只需使用这个

       wordOffset := anyregular expression OR text to filter
    
       selector:= bson.M{"title": bson.M{"$regex": wordOffset}}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-08
      • 2015-06-19
      • 1970-01-01
      • 2014-12-15
      • 1970-01-01
      相关资源
      最近更新 更多