2017-04-17 4 views
0

Ich versuche Dokumente zurückzugeben, deren ObsNum-Feld mit 1. beginnt. Ich habe folgende RegEx geschrieben jedoch diese Dokumente herausgefiltert werden, es gibt alle Dokumente, die mit 1MongoDB RegEx funktioniert nicht

Observations.getObservationsModelObject().find({ 
    "ageGroup": ageGroup, 
    "obsNum": { 
     $regex: '^\s*1\.' 
    } 
}, function(err, foundData) {}); 

starten Was mache ich falsch?

Diese RegEx '^\s*1\.' ist die Rückkehr folgende statt auf 1.3 zurückzukehren, 1,1 & 1.2:

obsNum: 1.3 
obsNum: 1.1 
obsNum: 1.2 
obsNum: 123 
obsNum: 121` 
+1

Sie übergeben die Regex als String, also müssen Backslashes doppelt maskiert werden. Verwenden Sie '$ regex:/^ \ s * 1 \ ./' – Tushar

+0

@Tushar Sie sind absolut richtig. Das war das einzige Problem mit meiner Regex. Können Sie mir bitte sagen, warum müssen wir einen doppelten Backslash in eine Regex-Zeichenfolge einfügen? – user2498079

+0

In Zeichenketten wird Backslash verwendet, um das folgende Zeichen zu entfernen. Also, eine für die Flucht und andere für Metazeichen in Regex. Oder verwenden Sie einfach die Regex-Literalsyntax wie im ersten Kommentar gezeigt. – Tushar

Antwort

2

'^\s*1\.' ist ein String. Die Regex nach dem Entfernen von Backshash-Escaping wird ^s*1. sein, was bedeutet, dass die Zeichenfolge mit einer beliebigen Anzahl von Leerzeichen beginnen sollte, gefolgt von 1 und dann einem beliebigen Zeichen.

Sie können regex Literalsyntax verwenden

$regex: /^\s*1\./ 

oder Doppel Flucht Schrägstriche

$regex: '^\\s*1\\.' 

Ich empfehle Literalsyntax zu verwenden, wann immer möglich, da es einfach ist und weniger fehleranfällig.

+0

Danke für die tolle Antwort! – user2498079

0

Der reguläre Ausdruck Sie versuchen könnte, ist:

^(1\.\d+) 

Erläuterung:

  • ^ Anfang der Zeichenfolge
  • (…) Capturing Klammern: Speichern Sie das Spiel
  • 1 Wörtliche Ziffer
  • \d Nachkommastelle
  • + Mindestens ein