mgo регулярният израз не работи

Сега имам някои документи, всеки от които има ключ path и стойност като \A\, \B\, \A\C\, \A\C\D\, \A\E\, \A\E\F\.

Искам да намеря тези, които имат само 1 сегмент. Това означава, че резултатът трябва да бъде \A\ и \B\. Използвам регулярен израз /^\\[^\\]*\\$/, който работи добре в MongoDB терминал. Но когато се опитах да го приложа към Go програми, не работи.

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?

(Не знам дали е неуместно, но също така публикувах този въпрос на пощенски списък 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 обратната наклонена черта (\) е екраниращият знак на интерпретиран низов литерал (използвайки "..." като ограждащи елементи). Във вашия случай предпочитате да използвате необработен низов литерал (използвайки `...` като ограждащи елементи).

Нека да разгледаме тази част от кода:

package main

import "fmt"

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

Резултат:

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

Можете да видите, че втората опция е редовният изразен низ, който желаете. Така че, за да разрешите проблема си, просто оградете своя регулярен израз в обратни отметки вместо в кавички:

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

Препратка към спецификации: http://golang.org/ref/spec#String_literals

person ANisus    schedule 10.04.2014
comment
Да, работи, но какво ще стане, ако искам регулярният ми израз да бъде някои низове, конкатенирани с низови променливи? Например, вече имам низова променлива, чиято стойност е \A\ , и искам да намеря path с 2 сегмента, т.е. \A\C\ и \A\E\ , така че регулярният израз трябва да е `^`+variable+`[^\\]*\\$`, но всъщност вътре в variable, той е \A\ , а не \\A\\ , и ръчно да добавя \ отпред и в края не работи. Опитах се да заменя \ с \\ , но пак не става. - person Melkor; 11.04.2014
comment
О, съжалявам, направих грешка. Работи добре, ако заменя \ с \\ . Но все пак е малко странно, защото това, което съм съхранил в mongodb, не е \\ , а \ , така че защо трябва да използвам \\ , за да го намеря? - person Melkor; 11.04.2014
comment
@Melkor: Трябва да използвате \\ , защото регулярният израз в стил perl също използва обратна наклонена черта като екраниращ знак. И така, в регулярен израз \\ означава 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