2012-05-09 8 views
5

यहां समस्या है: उपयोगकर्ता को टेक्स्ट फ़ील्ड प्रस्तुत किया जाता है, जिसके लिए वह फ़िल्टर टाइप कर सकता है । Unfiltered डेटा फ़िल्टर करने के लिए एक फ़िल्टर। उपयोगकर्ता, ओरेकल फॉर्म मस्तिष्कविश का अनुभव कर रहा है, एक्स्पेट्स% के अलावा कोई विशेष वर्ण नहीं है, जो मुझे लगता है कि जावा में "। *" Regex के लिए कम या ज्यादा खड़ा है।सभी रेगेक्स विशेष वर्णों से कैसे बचें, लेकिन सभी एक बार (Pattern.quote() द्वारा), केवल एक-एक करके

उपयोगकर्ता व्यक्ति अच्छी तरह व्यवहार किया जाता है, यह देखते हुए व्यक्ति "CTHULH%" की तरह सामान, जिस स्थिति में मैं एक पैटर्न का निर्माण हो सकता है टाइप करेगा:

Pattern.compile(inputText.replaceAll("%", ".*")); 

लेकिन अगर उपयोगकर्ता व्यक्ति Innsmouth की निवासी है, insurmountably होगा वह टाइप "+ \ [एक - # $%^& * (।" कुछ सरल कीस्ट्रोक्स के साथ मेरी योजना को नष्ट यह काम नहीं करेगा:

Pattern.compile(Pattern.quote(inputText).replaceAll("%", ".*")); 

के रूप में यह शुरुआत और \ ई पर \ क्यू डाल देंगे। स्ट्रिंग के अंत में, मेरा% ->। * स्विच moot प्रस्तुत करना।

सवाल यह है: क्या मुझे पैटर्न कोड में हर विशेष चरित्र को देखना है और आगे "\\" जोड़कर इसे स्वयं से बचाना है, या यह स्वचालित रूप से किया जा सकता है? या क्या मैं समस्या में इतना गहरा हूं, मैं संकल्प के कुछ स्पष्ट तरीके को छोड़ रहा हूं?

उत्तर

2

Pattern.compile(Pattern.quote(inputText).replaceAll("%", "\\E.*\\Q")); के बारे में क्या उपयोग कर रहा?

यह निम्नलिखित पैटर्न में परिणाम चाहिए:

input: ".+\[a-#$%^&*(" 
quote: \Q".+\[a-#$%^&*("\E 
replace: \Q".+\[a-#$\E.*\Q^&*("\E 

मामले में % चरित्र प्रथम या अंतिम चरित्र था आप मिलेगा एक \Q\E (यदि आप केवल इनपुट % है अभिव्यक्ति \Q\E.*\Q\E किया जा रहा हो जाएंगे) लेकिन यह अभी भी एक वैध अभिव्यक्ति होना चाहिए।

अद्यतन:

मैं replace(...) और replaceAll(...) के बीच का अंतर भूल गया: पूर्व में प्रतिस्थापन पैरामीटर एक शाब्दिक है जबकि बाद में प्रतिस्थापन एक अभिव्यक्ति ही है। इस प्रकार - जैसा कि आपने पहले ही अपनी टिप्पणी में कहा है - आपको Pattern.compile(Pattern.quote(inputText).replaceAll("%", "\\\\E.*\\\\Q")); पर कॉल करने की आवश्यकता है (स्ट्रिंग में और अभिव्यक्ति में बैकस्लैश उद्धरण दें)।

प्रलेखन से String#replaceAll(...) पर:

ध्यान दें कि प्रतिस्थापन स्ट्रिंग के बैकस्लैश परिणाम अगर यह एक शाब्दिक प्रतिस्थापन स्ट्रिंग के रूप में इलाज किया जा रहा था की तुलना में अलग होने का कारण बन सकता है।

+0

+1 लेकिन मुझे यकीन नहीं है कि 'उद्धरण विधि विधि * के लिए प्रलेखन * गारंटी देता है कि एक स्ट्रिंग हमेशा \ \ Q' और' \ E' से घिरा होगा (यह केवल "यह विधि एक स्ट्रिंग उत्पन्न करती है जो कर सकती है एक पैटर्न बनाने के लिए इस्तेमाल किया जाए जो स्ट्रिंग से मेल खाता है जैसे कि यह एक शाब्दिक पैटर्न था। ")। हालांकि प्रैक्टिस में मुझे लगता है कि जावा के वर्तमान में मौजूदा सभी विकृतियां इसे प्राप्त करने के लिए '\ Q ... \ E' दृष्टिकोण का उपयोग करती हैं। –

+0

@ थॉमस ने नौसिखिया प्रश्न से बहाना - यहां कस्टम क्या है? जब आप उत्तर अपडेट करते हैं तो क्या मैं अपनी टिप्पणियां हटा सकता हूं? –

+0

@pafauk। हम्म, मुझे यकीन नहीं है, लेकिन अगर टिप्पणियां कोई अतिरिक्त जानकारी प्रदान नहीं करती हैं (जो मुझे लगता है कि अब हमारी टिप्पणियों के बारे में सच है), तो मैं उन्हें पद को स्पष्ट रखने के लिए हटा दूंगा। मैं अपनी पिछली टिप्पणियां शुरू और हटा दूंगा। – Thomas

6

मुझे लगता है कि इस एल्गोरिथ्म आप के लिए काम करना चाहिए:

  • स्प्लिट पर %
  • उद्धरण प्रत्येक भाग को अलग से उपयोग करते हुए Pattern.quote
  • स्ट्रिंग शामिल हों .*
+0

धन्यवाद! अच्छा और साफ, हालांकि कुछ कामों की याद रखने की ज़रूरत है यदि शुरुआत में और/या स्ट्रिंग के अंत में% था। –

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