2011-10-25 8 views
5

की तुलना में जावा एपीआई से एक अलग जवाब मिलता है, मुझे अपना रेगेक्स गलत करना होगा।मोंगोडीबी रेगेक्स, मुझे कंसोल

कंसोल में मैं

db.triples.find({sub_uri: /.*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 परिणाम प्राप्त के रूप में मैं, जावा कोड से मैं कोई परिणाम नहीं मिलना चाहिए।

उत्तर

9

जावा को रेगेक्स डिलीमीटर (/ रेगेक्स के आसपास) की आवश्यकता/समझने की आवश्यकता नहीं है। आपको उन्हें हटाने की जरूरत है:

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

मुझे यह भी सुनिश्चित नहीं है कि रेगेक्स वास्तव में आप क्या चाहते हैं। कम से कम आप इसे लंगर चाहिए:

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

और Pattern.MULTILINE विकल्प का उपयोग कर यह संकलन। यदि किसी पंक्ति में आपका उप-रेगेक्स input नहीं है तो इससे गंभीर प्रदर्शन दंड से बचा जाता है। आप जानते हैं कि input एक रेगेक्स है, वर्बैटिम स्ट्रिंग नहीं, है ना?

+0

मेरी समझ: अगर इनपुट = "पीडीएफ" मुझे लगता है कि मैंने जो किया है वह स्ट्रिंग पैटर्न = "/.*pdf.*/" के बराबर है - मुझे गलत होना पसंद है, जो मेरी परेशानियों को समझाएगा । – Ankur

+0

धन्यवाद, आपका regex अच्छी तरह से काम करता है। – Ankur

+1

@ अंकुर: आपकी धारणा सही है। बस जागरूक रहें कि यदि 'इनपुट' थे, तो 'ए + बी' कहें, आपका रेगेक्स टेक्स्ट 'xxxa + bxxx' से मेल नहीं खाएगा क्योंकि + रेगेक्स में + का विशेष अर्थ है। –

संबंधित मुद्दे