2012-10-09 12 views
5

मैं अपनी समस्या के लिए उचित रेगेक्स बनाने की कोशिश कर रहा हूं और स्पष्ट रूप से अजीब मुद्दे में भाग गया।जावा रेगेक्स लुकहेड बहुत अधिक समय लेता है

मुझे कि मैं क्या करने की कोशिश कर रहा हूँ का वर्णन करते हैं ..

मेरा लक्ष्य स्ट्रिंग के दोनों सिरों से अल्पविराम के दूर करने के लिए है। ई, जी, स्ट्रिंग , ,, ,,, , , Hello, my lovely, world, ,, , सिर्फ Hello, my lovely, world बनना चाहिए।

मैं regex निम्नलिखित यह पूरा करने के लिए तैयार है: (\w+,*? *?)+(?=(,?\W+$))

यह regex प्रमाणकों में एक आकर्षण की तरह काम करता है, लेकिन जब मैं Android डिवाइस पर इसे चलाने के लिए कोशिश कर रहा हूँ, matcher.find() समारोह के लिए लटकी हुई है ~ 1min एक को खोजने के लिए उचित मैच ... मुझे लगता है, समस्या सकारात्मक अग्रदर्शी मैं उपयोग कर रहा हूँ में है, लेकिन मैं किसी भी बेहतर समाधान नहीं मिल सका से बस शुरू से ही है और अंत में अलग अल्पविराम के ट्रिम:

output = input.replaceAll("^(,?\\W?)+", ""); //replace commas at the beginning 
output = output.replaceAll("(,?\\W?)+$", ""); //replace commas at the end 

है सकारात्मक लुकहेड में मैं कुछ खो रहा हूं एन जावा regex? मैं शुरुआत में और अंत में अल्पविरामों के बीच स्ट्रिंग सेक्शन कैसे प्राप्त कर सकता हूं?

उत्तर

8

यदि आप मिलान करने वाले समूहों का उपयोग करते हैं तो आपको लुकहेड का उपयोग करने की आवश्यकता नहीं है। regex ^[\s,]*(.+?)[\s,]*$ का प्रयास करें:

संपादित करें: यह अलग, ^ से मेल खाता है लाइन है, जो तकनीकी रूप से बेमानी है अगर matches() का उपयोग कर लेकिन कहीं उपयोगी हो सकता है की शुरुआत को तोड़ने के लिए। [\s,]* शून्य या अधिक व्हाइटस्पेस वर्ण या अल्पविराम से मेल खाता है, लेकिन लालची - यह जितना संभव हो सके उतने पात्र स्वीकार करेगा। (.+?) वर्णों की किसी भी स्ट्रिंग से मेल खाता है, लेकिन पिछला प्रश्न चिह्न इसे जितना संभव हो उतना पात्र (गैर-लालची) से मेल खाता है, और सामग्री को "समूह 1" पर भी कैप्चर करता है क्योंकि यह ब्रांड्स के पहले सेट को बनाता है। गैर-लालची मैच अंतिम समूह को एक ही शून्य-या-अधिक कॉमा या सफेद स्थान ([\s,]*) रखने की अनुमति देता है। ^ की तरह, अंतिम $ लाइन के अंत से मेल खाता है - find() के लिए उपयोगी लेकिन matches() के लिए अनावश्यक।

यदि आपको केवल रिक्त स्थान से मिलान करने की आवश्यकता है, तो [ ,] के साथ बदलें।

यह काम करना चाहिए:

Pattern pattern = Pattern.compile("^[\\s,]*(.+?)[\\s,]*$"); 
Matcher matcher = pattern.matcher(", ,, ,,, , , Hello, my lovely, world, ,, ,"); 
if (!matcher.matches()) 
    return null; 
return matcher.group(1); // "Hello, my lovely, world" 
+0

arghh ... मैं कैसे मेल खाने वाले समूह को याद कर सकता है .. :(धन्यवाद एक बहुत मैं अपने रेगुलर एक्सप्रेशन से ज्ञान को ब्रश करना मिला ... –

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