我正在尝试对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的投诉
答案 0 :(得分:0)
您必须像这样在正则表达式中转义点:
db.Test.find({filename: { $regex: '.*\\.crc', $options: 'i'}})
答案 1 :(得分:0)
根据错误消息,MongoDB似乎尝试解码\.
之类的JSON字符串,但这不是有效的转义序列。
请参阅:https://www.freeformatter.com/json-escape.html
因此,也许您应该将.
更改为\\\\.
,以便将其编码为真实的\\
,并在JSON中将其解码为\
或者,正如我在评论中所说,有时使用类对字符进行转义要容易得多。因此,您可以使用[.]
。这样可以避免使用反斜杠,反斜杠也是特殊字符,根据正则表达式是否为字符串,它们可能需要转义几次。