我正在尝试对mongodb数据库运行查询。用户查询是一种类似于perl的正则表达式。我正在将用户的正则表达式转换为Mongo过滤器。
这是查询代码:
private List<string> GetDocuments(string by_regex)
{
string regex = by_regex.Replace("[", @"\[");
regex = regex.Replace("]", @"\]");
regex = regex.Replace("*", ".*");
regex = "^" + regex + "$";
var filter = string.Format("{{_id:'CRF^{0}'}}", regex);
MyObject item = collection.Find(filter).SingleOrDefault();
....
}
使用正则表达式*.crc
调用上述方法会在Find
语句中抛出异常:
Invalid escape sequence in JSON string '\.'.
运行时的过滤器是{_id:'CRF^^.*\\.crc$'}
- 所以我认为这是.
char逃逸的东西,但由于某种原因我无法找到正确的方法来逃避它以使Mongo不抱怨。
根据错误消息,MongoDB似乎尝试解码像\.
这样的JSON字符串,这不是一个有效的scape序列。
见:https://www.freeformatter.com/json-escape.html
所以也许你应该将.
更改为\\\\.
,以便将其编码为真正的\\
,将在JSON中解码为\
或者,正如我在评论中所说,有时使用类来填充字符要容易得多。所以你可以使用[.]
。这样你就可以避免使用反斜杠,反斜杠也是特殊字符,根据正则表达式是否为字符串,它们可能需要多次扫描。
你必须在你的正则表达式中转义点,如下所示:
db.Test.find({filename: { $regex: '.*\\.crc', $options: 'i'}})