MongoDB regex,与控制台相比,我从Java API得到了不同的答案



一定是我的正则表达式写错了。

在控制台我做

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代码中我没有得到任何结果。

Java不需要/理解regex分隔符(在regex周围的/)。你需要删除它们:

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

我也不确定这个正则表达式是否真的是你想要的。至少你应该锚定它:

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

并使用Pattern.MULTILINE选项编译它。如果一行不包含子正则表达式input,这可以避免严重的性能损失。您知道input是一个正则表达式,而不是一个逐字字符串,对吗?

最新更新