2013-11-22 12 views
5

मैं सिर्फ कैसे regex के उपयोग करने के लिए सीख रहा हूँ:Regex सर्वोत्तम प्रथाओं

मुझे लगता है कि दो अलग-अलग तरह की वर्गों में विभाजित है एक पाठ फ़ाइल, <:==]:> और <:==}:> द्वारा सीमांकन में पढ़ रहा हूँ। मैं क्या यह एक ] या }, तो मैं बस नहीं कर सकते

pattern.compile("<:==]:>|<:==}:>"); pattern.split(text) 

ऐसा है प्रत्येक अनुभाग के लिए पता करने की जरूरत:

pattern.compile("<:=="); pattern.split(text) 

काम करता है, और फिर मैं सिर्फ पहले चार देख सकते हैं प्रत्येक स्ट्रिंग में है, लेकिन यह मेरे लिए खराब लगता है, और मुझे लगता है कि मैं सिर्फ यह का सहारा रहा हूँ क्योंकि मैं पूरी तरह से कुछ मैं regex के बारे में समझ की जरूरत है लोभी नहीं कर रहा हूँ:

यहाँ क्या सबसे अच्छा अभ्यास हो सकता है? साथ ही, परिणामी तारों में डेलीमीटर छोड़ते समय स्ट्रिंग को विभाजित करने का कोई तरीका है- जैसे कि प्रत्येक डिलीमीटर के साथ शुरू होता है?

संपादित करें: फ़ाइल इस तरह से बाहर रखा जाता है:

Old McDonald had a farm 
<:==}:> 
EIEIO. And on that farm he had a cow 
<:==]:> 
And on that farm he.... 
+0

मेरे प्रारंभिक समाधान (एक कैप्चरिंग समूह में सीमांकक enclosing) (अजगर की तरह अन्य भाषाओं में काम किया है |) जावा में काम करने के लिए नहीं है, इसलिए मैं इस पर पुनर्विचार करने की जरूरत है। क्या आप एक छोटी नमूना फ़ाइल प्रदान कर सकते हैं? मुझे पूरा यकीन नहीं है कि मैं समझता हूं कि वास्तव में खंड कैसे सीमित हैं। क्या वे delimiters के जोड़े से घिरे हैं, या एक खंड एक delimiter के बाद शुरू होता है और अगले delimiter के साथ खत्म होता है? –

+0

@TimPietzcker हाँ, मुझे वही अहसास था। फ़ाइल के रखे गए तरीके के उदाहरण के लिए मेरा संपादन देखें। वे डेलीमीटर के जोड़े नहीं हैं, प्रत्येक का अंत अगले की शुरुआत से संकेत मिलता है। साथ ही, मुझे ध्यान रखना चाहिए कि <:?:> कई अन्य प्रकार के टैग – drewmoore

+0

को इंगित करता है तो आप आउटपुट के रूप में वास्तव में क्या चाहते हैं? पाठ का अनुभाग या तो '' '' या '}' के साथ? यदि ऐसा है तो आप पहले/आखिरी खंड के लिए क्या चाहते हैं जो सीमित नहीं है? क्या आपको पाठ के अनुभाग की आवश्यकता है या क्या यह केवल डिलीमीटर करने के लिए पर्याप्त है? – OGHaza

उत्तर

6

यह एक बेहतर विचार इस के लिए split() उपयोग करने के लिए नहीं हो सकता। इसके बजाय आप एक मैच कर सकता है:

List<String> delimList = new ArrayList<String>(); 
List<String> sectionList = new ArrayList<String>(); 
Pattern regex = Pattern.compile(
    "(<:==[\\]}]:>)  # Match a delimiter, capture it in group 1.\n" + 
    "(     # Match and capture in group 2:\n" + 
    " (?:    # the following group which matches...\n" + 
    " (?!<:==[\\]}]:>) # (unless we're at the start of another delimiter)\n" + 
    " .    # any character\n" + 
    ")*    # any number of times.\n" + 
    ")     # End of group 2", 
    Pattern.COMMENTS | Pattern.DOTALL); 
Matcher regexMatcher = regex.matcher(subjectString); 
while (regexMatcher.find()) { 
    delimList.add(regexMatcher.group(1)); 
    sectionList.add(regexMatcher.group(2)); 
} 
+1

ऐसा लगता है कि आप इसे पूरी तरह से grokked। मुझे लगता है कि आपके सभी सवालों का जवाब हां है। विवरण के लिए, यह [जनवरी गोवार्ट्स द्वारा नियमित अभिव्यक्ति ट्यूटोरियल] देखें (http://www.regular-expressions.info/tutorial.html), विशेष रूप से [कैप्चरिंग समूहों] पर अनुभाग (http: //www.regular-expressions .info/brackets.html) और [लुकराउंड दावे] (http://www.regular-expressions.info/lookaround.html)। आपके अंतिम प्रश्न के लिए, क्या आप अधिक विशिष्ट हो सकते हैं? शायद किसी अन्य प्रश्न के रूप में टिप्पणियां इस के लिए वास्तव में उपयुक्त नहीं हैं? –

+0

मुझे टिप्पणियों के साथ इस उदाहरण को पसंद है, लेकिन ध्यान दें कि एक स्थिर रेगेक्स आमतौर पर स्थिर रूप से संकलित होता है (एक बार) और कई बार पुन: उपयोग किया जाता है। यह भी देखें: http://stackoverflow.com/questions/4935216/shouldnt-static-patterns-always-be-static भी देखें http://stackoverflow.com/questions/1360113/is-java-regex-thread-safe –

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