#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. Теперь я понимаю, что вы имели в виду 🙂 Еще раз спасибо.