25

我想搜索具有特殊字符的值,例如" $ / . @ > "文档中的值。

让我们考虑一下,我的 myKey 的值如下"test$australia", "test$austria", "test$belgium", "green.africa".

我想用'.*$aus.*',

例如,

db.myCollection.find({ myKey : /.*$aus.*/i }); 

或者

db.myCollection.find({ myKey : { '$regex' : '.*$aus.*','$options' : 'i' });

以上查询不起作用,我应该如何形成查询?我正在使用 MongoDB 2.4.1。

4

7 回答 7

23

您必须$通过以下方式逃脱\

db.myCollection.find({ myKey : /.*\$aus.*/i }); 
// OR
db.myCollection.find({myKey: { $regex: '.*\\$aus.*', $options: 'i'}})
于 2013-05-15T09:00:37.987 回答
5

你可以使用这个:

db.myCollection.find({myKey:{ $regex:new RegExp('^' + 'test$australia'.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + '$', 'i')}})
于 2018-06-14T08:31:12.267 回答
5

转义所有正则表达式特殊字符:

  req.query.name.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');

使用正则表达式和选项“i”(忽略大小写)创建查询:

  const databaseQuery.name = new RegExp(`${req.query.name}`, 'i');

使用查询执行搜索:

  db.collection.find(databaseQuery)

注意:不要忘记为要搜索的字段创建索引。索引字段可提高正则表达式查询的速度。就我的“名称”字段而言,它将是这样的:

  db.collection.createIndex({ name: "text" })
于 2018-09-13T21:25:00.570 回答
3
db.test.insert({word: 'hai('});
db.test.insert({word: 'jana'});

输出是这样的:

{ "_id" : ObjectId("56f27fb71d843581261433c6"), "word" : "hai(" }
{ "_id" : ObjectId("56f27ffe1d843581261433c8"), "word" : "jana" }

注意:想要单独的特殊字符行

db.test.find({word:{$regex:"\\("}});

输出如下:

{ "_id" : ObjectId("56f27fb71d843581261433c6"), "word" : "hai(" }
于 2016-03-23T12:02:57.303 回答
0

re.escape在将解决特殊字符正则表达式问题的函数下定义搜索键。

{search_field: {"$regex": '{}.*'.format(re.escape(search_key)),"$options": 'i'}}
于 2020-01-29T09:37:51.103 回答
0

https://stackoverflow.com/a/52322010/8208083的 Java 等效项如下:

Pattern p = Pattern.compile("[\\.\\*\\+\\?\\^\\${}\\(\\)|\\]\\[\\\\]");
Matcher m = p.matcher(searchKeyword);
searchKeyword = m.replaceAll("\\\\$0");

当您需要在 Spring 的 @Query 注解中传递搜索关键字时,这很有用。

于 2020-10-30T12:18:26.963 回答
0

You can use https://www.npmjs.com/package/regex-escape. It is a good library for escaping special characters to be used in regular expressions

    var RegexEscape = require("regex-escape");

    let keyword = RegexEscape("{#/}");
    // => \{#\/\}


   db.myCollection.find({ myKey : { '$regex' : keyword, '$options' : 'mi' });
于 2019-09-03T02:52:35.627 回答