Подтвердить что ты не робот

Запрос регулярного выражения Java Mongodb

Мне нужно запустить этот запрос в Java

 db.Users.find({"name": /^ind/i})

Мой код Java

Document findQuery = new Document();
findQuery.append("name", Pattern.compile("/^"+name+"/i"));
FindIterable<Document> iterable = db.getCollection("Users").find(findQuery);

Он не возвращает никаких данных, я думаю, что приведенный выше java-код преобразует

> /^ind/i into "/^ind/i"

Спасибо заранее.

Edit:

На основе stribizhev предложение обновило запрос и его работу

db.Users.find({"name": {"$regex": /^ind/, "$options": "i"}})

Код Java

Document regQuery = new Document();
regQuery.append("$regex", "^(?)" + Pattern.quote(name));
regQuery.append("$options", "i");

Document findQuery = new Document();
findQuery.append("name", regQuery);
FindIterable<Document> iterable = db.getCollection("Users").find(findQuery);
4b9b3361

Ответ 1

Вы не можете использовать разделители регулярных выражений в Java Pattern.compile, так как есть другие средства в Java (например, флаги), чтобы сделать то же самое.

Чтобы обеспечить поиск без учета регистра, используйте встроенный модификатор (?i). Так, используйте "^(?i)"+Pattern.quote(name) вместо "/^"+name+"/i".

Pattern.quote просто избегает всех метасимволов регулярных выражений, чтобы их обрабатывали как литералы (такие же, как \Q... \E).

Ответ 2

Я думаю, что есть более элегантный способ сделать это на Java, используя предоставленные фильтры в Java-драйвере MongoDB (версия 3 и выше):

Document query = new Document("equipment","gloves");

//whatever pattern you need. But you do not need the "/" delimiters
String pattern = ".*" + query.getString("equipment") + ".*";

//find(regex("field name", "pattern", "options"));
collection.find(regex("equipment", pattern, "i"));

Ответ 3

Вы можете использовать Pattern-and Filters -

Pattern regex = Pattern.compile("ind", Pattern.CASE_INSENSITIVE);
Bson filter = Filters.eq("name", regex);

В шаблоне объекта есть несколько других флагов, как вы можете видеть здесь