2014-09-18 6 views
5

मैं एक Neo4j डेटाबेस में नोड्स से मिलान करने की कोशिश कर रहा हूं। नोड्स में "नाम" नामक एक संपत्ति होती है और मैं इसका मिलान करने के लिए साइफर में नियमित अभिव्यक्ति का उपयोग कर रहा हूं। मैं केवल पूरे शब्दों से मेल खाना चाहता हूं, इसलिए यदि मैं स्ट्रिंग "जावा" की आपूर्ति करता हूं तो "जावास्क्रिप्ट" मेल नहीं खाया जाना चाहिए। यदि मिलान करने वाली स्ट्रिंग कई शब्दों का है, यानी "जावा स्क्रिप्ट" मैं दो अलग-अलग प्रश्न पूछूंगा, एक "जावा" और एक "स्क्रिप्ट" के लिए।नियमित अभिव्यक्ति के साथ साइफर क्वेरी

match (n) where n.name =~ '(?i).*\\bMYSTRING\\b.*' return n 

यह काम करता है, लेकिन ऐसा लगता है "+" या "#" कुछ विशेष वर्ण के साथ काम नहीं करता है:

यह वही है मैं अब तक है। तो मैं "सी ++" या "सी #" आदि की खोज नहीं कर सकता। उपरोक्त कोड में नियमित अभिव्यक्ति केवल शब्द सीमा के लिए \ b का उपयोग कर रही है। यह भी इससे बच रहा है ताकि यह सही तरीके से काम कर सके।

मैंने इस पोस्ट के कुछ संस्करणों की कोशिश की: regex to match word boundary beginning with special characters लेकिन यह वास्तव में काम नहीं किया, शायद मैंने कुछ गलत किया।

मैं इस काम को साइफर और नियो 4j में विशेष पात्रों के साथ कैसे बना सकता हूं?

उत्तर

3

विशेष पात्रों से बचने और शब्द सीमाओं के बजाय गैर-शब्द वर्णों को देखने का प्रयास करें। उदाहरण के लिए;

match (n) where n.name =~ '(?i).*(?:\\W|^)C\\+\\+(?:\\W|$).*' return n 

हालांकि इसमें अभी भी कुछ झूठे सकारात्मक हैं, उदाहरण के लिए उपरोक्त "सी +++" से मेल खाता है।

"गैर शब्द चरित्र के लिए, सिवाय इसके कि हम + शब्द चरित्र के रूप में + इलाज करना चाहते हैं" निम्नलिखित काम कर सकते हैं।

match (n) where n.name =~ '(?i).*(?:[\\W-[+]]|^)C\\+\\+(?:[\\W-[+]]|$).*' return n 

इस हालांकि सभी regexp जायके द्वारा समर्थित नहीं है, और मुझे यकीन है कि अगर Neo4j इस का समर्थन करता है नहीं कर रहा हूँ।

+1

यह सामान्य रूप से काम करेगा, लेकिन \ b शब्द सीमा केवल अल्फान्यूमेरिकल वर्णों के साथ संचालित होती है, इसलिए यह "C++" (जो या तो एक विशेष चरित्र के साथ शुरू होती है या समाप्त होती है) से मेल नहीं खाती है। यह "सी ++ सी" जैसे गुणों से मेल खाता है क्योंकि यह "सी" के साथ समाप्त होता है। –

+0

@ ओविंद अपडेट किया गया। – Taemyr

+0

यह काम कर रहा था, लेकिन अगर आप अपडेट किए गए उत्तर में उल्लेख करते हैं तो स्ट्रिंग से पहले या बाद में वर्ण होने पर यह मेल खाता था। क्या इसे केवल पूरे शब्दों पर मेल करने का कोई तरीका है? अद्यतन अद्यतन नहीं होगा '(? I)। * सी \\ + \\ +। *'? –

1

आप शब्द सीमाओं को ज़ोर देने के बजाय आगे और पीछे अपने मैच के पीछे सफेद-रिक्त स्थान (या बिल्कुल भी नहीं - मैच की सीमा) पर जोर दे सकते हैं। यहाँ

(?i).*(?<!\\S)MYSTRING(?!\\S).* 

, आप एक regex demo के साथ बेला कर सकते हैं: इस देखें। यह केवल आपकी स्ट्रिंग से मेल खाएगा यदि यह आपके शब्द के सामने और बाद में सफेद जगहों या सीमाओं के बीच है। अगर आप की जरूरत है आप "विराम चिह्न" परिभाषित कर सकते हैं, इस तरह:

(?i).*(?<![^\\s.,$])MYSTRING(?![^\\s.,$]).* 
       ^^^ add boundaries ^^^ 

तो यह rawrssss MYSTRING. dd भी भरपाई कर देंगे।

regex demo देखें!

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