使用MongoDB的Golang服务中,如何用正则匹配含前后空白的字符串?
解决mgo驱动中MongoDB正则匹配前后空白字符串的问题
你遇到的问题根源有两个:
- 原正则表达式
^\s+text\s+$要求前后至少有一个空白字符,无法匹配仅包含"text"或单边带空白的字符串; - 使用Go的
regexp.MustCompile结合Options的方式,存在Go正则与MongoDB正则语法的兼容问题,导致匹配未生效。
1. 修正正则表达式
将正则中的\s+替换为\s*,*表示匹配0个或任意数量的空白字符,这样就能覆盖"text"、" text "、"text "、" text"等所有符合需求的场景。修正后的正则为:^\s*text\s*$,搭配i选项实现大小写不敏感匹配。
2. 正确的mgo查询写法
推荐直接使用MongoDB原生的$regex和$options参数构建查询,避免Go正则库的转义问题:
package main import ( "fmt" "gopkg.in/mgo.v2" "gopkg.in/mgo.v2/bson" ) type Item struct { ID bson.ObjectId `bson:"_id"` Text string `bson:"text"` } func main() { session, err := mgo.Dial("mongodb://localhost:27017") if err != nil { panic(err) } defer session.Close() c := session.DB("test").C("items") // 查询前后带任意空白的text字符串(忽略大小写) var results []Item err = c.Find(bson.M{ "text": bson.M{ "$regex": `^\s*text\s*$`, "$options": "i", }, }).All(&results) if err != nil { panic(err) } for _, item := range results { fmt.Printf("匹配到:'%s'\n", item.Text) } }
如果坚持使用Go的regexp.MustCompile,需要使用内联选项(?i)来启用大小写不敏感,写法如下:
import "regexp" // ... regex := regexp.MustCompile(`(?i)^\s*text\s*$`) err = c.Find(bson.M{"text": regex}).All(&results)
关键说明
\s*能匹配0个或多个空白字符(空格、制表符等),完全覆盖你需要的"任意数量前导或尾随空白"场景;- 直接使用MongoDB的
$options参数比Go正则的Options更可靠,避免跨语法兼容问题; i选项确保匹配时忽略大小写,符合你原需求的/.../i模式。
内容的提问来源于stack exchange,提问作者Mudamala Jayasimha Reddy
相关产品推荐
相关产品推荐

