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

时间:2018-07-12 06:50:26

标签: c# regex mongodb

我正在尝试对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$'}-因此,我认为这与.字符转义有关,但是由于某些原因,我找不到正确的方法来逃避Mongo的投诉

2 个答案:

答案 0 :(得分:0)

您必须像这样在正则表达式中转义点:

db.Test.find({filename: { $regex: '.*\\.crc', $options: 'i'}})

答案 1 :(得分:0)

根据错误消息,MongoDB似乎尝试解码\.之类的JSON字符串,但这不是有效的转义序列。

请参阅:https://www.freeformatter.com/json-escape.html

因此,也许您应该将.更改为\\\\.,以便将其编码为真实的\\,并在JSON中将其解码为\

或者,正如我在评论中所说,有时使用类对字符进行转义要容易得多。因此,您可以使用[.]。这样可以避免使用反斜杠,反斜杠也是特殊字符,根据正则表达式是否为字符串,它们可能需要转义几次。