MongoDB regex, я получаю другой ответ от Java API по сравнению с консолью

#java #regex #mongodb

#java #регулярное выражение #mongodb

Вопрос:

Должно быть, я неправильно выполняю свое регулярное выражение.

В консоли я делаю

db.triples.find({sub_uri: /.*pdf.*/ }); и получаю желаемый результат.

Мой класс Java выглядит следующим образом (я установил input=»pdf»):

     public static List<Triple> search(String input){

        DB db=null;
        try {
            db = Dao.getDB();
        }
        catch (UnknownHostException e1) {   e1.printStackTrace(); }
        catch (MongoException e1) {         e1.printStackTrace(); }

        String pattern = "/.*" input ".*/";
System.out.println(input);      

                List<Triple> triples = new ArrayList<Triple>();
                DBCollection triplesColl = null;

                try {
                    triplesColl = db.getCollection("triples");      } catch (MongoException e) { e.printStackTrace();}

                {                   
                    Pattern match = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE);
                    BasicDBObject query = new BasicDBObject("sub_uri", match);

                    // finds all people with "name" matching /joh?n/i
                    DBCursor cursor = triplesColl.find(query);

                    if(cursor.hasNext()){
                    DBObject tripleAsBSON = cursor.next();
                        Triple t = new Triple();
                        t.setSubject(new Resource((String)tripleAsBSON.get("sub_uri")));

System.out.println(t.getSubject().getUri());                

                        triples.add(t);
                    }   
            }
        return triples;
    }
 

Из консоли я получаю 12 результатов, как и должен, из кода Java я не получаю результатов.

Ответ №1:

Java не нужны / не понимают разделители регулярных выражений ( / вокруг регулярного выражения). Вам нужно их удалить:

 String pattern = ".*" input ".*";
 

Я также не уверен, действительно ли это регулярное выражение является тем, что вы хотите. По крайней мере, вы должны его привязать:

 String pattern = "^.*" input ".*$";
 

и скомпилируйте его, используя Pattern.MULTILINE опцию. Это позволяет избежать серьезного снижения производительности, если строка не содержит вашего подрегулярного выражения input . Вы знаете, что input это регулярное выражение, а не дословная строка, верно?

Комментарии:

1. Мое понимание: если input=»pdf», я предполагаю, что то, что я сделал, эквивалентно String pattern = «/.* pdf. */» — я бы хотел ошибаться, это объяснило бы мои проблемы.

2. @Ankur: Ваше предположение верно. Просто имейте в виду, что если input бы, скажем a b , было, ваше регулярное выражение не соответствовало бы тексту xxxa bxxx , потому что имеет особое значение в регулярном выражении.

3. Теперь я понимаю, что вы имели в виду 🙂 Еще раз спасибо.