регулярное выражение 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)

Выход:

[]

Это так странно, а потом я узнал, что любое регулярное выражение с \\ даст пустой результат.

Так это баг мго?

(Не знаю, уместно ли это, но я также разместил этот вопрос на странице список рассылки mgo.users.)


person Melkor    schedule 10.04.2014    source источник
comment
Попробуйте с \\` or \\\`, так как некоторые другие языки поддерживают этот способ, когда они помещаются внутри строки ""   -  person Sabuj Hassan    schedule 10.04.2014
comment
@SabujHassan Извините, это проблема с редактором? Я действительно не знаю, что ты пытаешься сказать.   -  person Melkor    schedule 11.04.2014


Ответы (3)


В Go обратная косая черта (\) — это escape-символ интерпретируемого строкового литерала (с использованием «...» в качестве вложений). В вашем случае вы бы предпочли использовать необработанный строковый литерал (используя `...` в качестве вложений).

Давайте посмотрим на этот кусок кода:

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< /а>

person ANisus    schedule 10.04.2014
comment
Да, это работает, но что, если я хочу, чтобы мое регулярное выражение представляло собой несколько строк, объединенных строковыми переменными? Например, у меня уже есть строковая переменная, значение которой равно \A\ , и я хочу найти path с двумя сегментами, т.е. \A\C\ и \A\E\ , поэтому регулярное выражение должно быть `^`+variable+`[^\\]*\\$`, но на самом деле внутри variable это \A\ , а не \\A\\ , и добавить вручную \ в начале и конце не работает. Я пытался заменить \ на \\ , но это все равно не работает. - person Melkor; 11.04.2014
comment
О, простите, я сделал ошибку. Это хорошо работает, если я заменю \ на \\ . Но все же это немного странно, потому что то, что я сохранил в mongodb, это не \\ , а \ , так почему мне нужно использовать \\ , чтобы найти его? - person Melkor; 11.04.2014
comment
@Melkor: вам нужно использовать \\ , потому что регулярное выражение в стиле perl также использует обратную косую черту в качестве escape-символа. Таким образом, в регулярном выражении \\ означает the character \ так же, как \. означает the character ., в отличие от ., что означает any character. - person ANisus; 11.04.2014
comment
да это я понимаю, я потом узнал что для того что бы сопоставить \ нужно пройти \\\\ . \\\\ будет переведено в \\ в golang, а \\ будет переведено в \ в поисковом запросе регулярного выражения. - person Melkor; 11.04.2014

Чтобы добавить в решение @sandun-priyanka, если вы хотите сделать его нечувствительным к регистру:

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

Просто используйте это

   wordOffset := anyregular expression OR text to filter

   selector:= bson.M{"title": bson.M{"$regex": wordOffset}}
person Sandun Priyanka    schedule 12.03.2018