如何在MongoDb正则表达式过滤器中过滤“。”?

问题描述 投票:0回答:2

我正在尝试对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不抱怨。

c# regex mongodb
2个回答
0
投票

根据错误消息,MongoDB似乎尝试解码像\.这样的JSON字符串,这不是一个有效的scape序列。

见:https://www.freeformatter.com/json-escape.html

所以也许你应该将.更改为\\\\.,以便将其编码为真正的\\,将在JSON中解码为\

或者,正如我在评论中所说,有时使用类来填充字符要容易得多。所以你可以使用[.]。这样你就可以避免使用反斜杠,反斜杠也是特殊字符,根据正则表达式是否为字符串,它们可能需要多次扫描。


0
投票

你必须在你的正则表达式中转义点,如下所示:

db.Test.find({filename: { $regex: '.*\\.crc', $options: 'i'}})
© www.soinside.com 2019 - 2024. All rights reserved.