2013-02-16 11 views
8

तार जांच की जा रही जैसे लगते हैं निम्नलिखित (कोष्ठक के बीच खाली स्थान के नोटिस):कैसे रेगुलर एक्सप्रेशन कैप्चर समूह से छंटनी की जा खाली स्थान के कर सकते हैं?

[name] [address ] [ zip] [ phone number ] 

अभिव्यक्ति मैं वर्तमान में उपयोग कर रहा हूँ ...

\[([^\])]*)\] 

... सफलतापूर्वक के भीतर प्रत्येक पाठ कब्जा कोष्ठक, लेकिन यह भी प्रमुख और अनुगामी अंतरिक्ष पकड़ लेता है तो मैं अंत:

"name" "address " " zip" " phone number " 

लेकिन क्या मैं की तलाश है:

"name" "address" "zip" "phone number" 

रेगेक्स इन उदाहरणों में व्हाइटस्पेस को कैप्चर नहीं करने के लिए कैसे आश्वस्त हो सकता है? (एम्बेडेड खाली स्थान के के अपवाद के साथ - जैसे कि "फ़ोन नंबर" में शब्दों के बीच के रूप में।)

(नोट: मैं जानता हूँ कि मैं सिर्फ चर पर कब्जा कर लिया के बाद अभिव्यक्ति किया जाता है से यह ट्रिम सकता है, लेकिन मैं मैं इसे अभिव्यक्ति के संदर्भ में करने की कोशिश कर रहा हूं।)

किसी भी विचार के लिए धन्यवाद!

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\[([^\\])]*)\\]" options:0 error:nil]; 

NSString *string = @" [name] [address ] [ zip] [ phone number ] "; 

NSString *modifiedString = [regex stringByReplacingMatchesInString:string options:0 range:NSMakeRange(0, [string length]) 
    withTemplate:@"\n\n[$1]"]; //note: adding brackets back here just to make it easy to see if the space has been trimmed properly from the captured value 

NSLog(@"\n\n%@", modifiedString); 

उत्तर

2

मैं कदम से इस कदम के माध्यम से जाने के लिए जा रहा हूँ: नीचे सटीक कोड मैं इस परीक्षण करने के लिए उपयोग कर रहा हूँ है।

पहले, ([^\])]*) सही नहीं है। इसका मतलब है "जितना संभव हो सके 0 या अधिक वर्णों का अनुक्रम, जिसमें शामिल नहीं है] या"। "

उदाहरण के लिए, इस अभिव्यक्ति के लिए:

[name] [address) ] [ zip] [ phone number ] 

... पता हिस्सा है, आप छोड़ दिया जाएगा के रूप में "पता)" [^\)]]* से मेल नहीं खाता ("जिसका अर्थ है शून्य या अधिक वर्णों का एक क्रम, शामिल नहीं) और]। "

हम बजाय ([^\]]*) चाहते हैं, जो छोड़ नहीं होगा)।

इसके बाद, हम पर कब्जा भर के सभी रिक्त स्थान खाना चाहता हूँ। उसके लिए, हमने दो  * दृश्यों, कब्जा के प्रत्येक पक्ष पर एक का उपयोग करें:

\[ *([^\]]*) *\]

अब हम मुश्किल पाने के लिए की जरूरत है! [^\]]* डिफ़ॉल्ट रूप से लालची है। इसका मतलब है कि किसी भी तरफ की कुछ जगहों से मिलान किया जा सकता है, और इस प्रकार कैप्चर में शामिल किया गया है! हम इसके बदले गैर लालची संस्करण, [^\]]*? का उपयोग करना चाहते हैं। इसका मतलब यह है ") 0 या अधिक वर्णों का एक क्रम से युक्त नहीं, संभव के रूप में कुछ समय नियमित अभिव्यक्ति के बाकी के अनुरूप है।"

\[ *([^\]]*?) *\]

+0

यह मेरे लिए एक मनोरंजक प्रश्न की तरह है, के रूप में मैं वर्षों के लिए regex और ऑब्जेक्टिव-सी लेखन किया गया है, लेकिन मैं उन्हें पहले NSRegularExpression' का उपयोग कर 'द्वारा संयुक्त कभी नहीं किया है। :) –

+1

धन्यवाद यह सही है! यदि आप NSRegularExpression के लिए नए हैं तो इसकी "enumerateMatchesInString: विकल्प: रेंज: उपयोगब्लॉक:" कुछ अवरोधक भलाई के लिए विधि: http://blog.kvnd.me/post/10186864667/regular-expressions-in-ios –

+0

क्या है पहले दाएं कोष्ठक ")" अपरिपक्व? ऐसा लगता है कि इसके बिना काम करना है। –

3
@"\\[\\s*([^\\]]+?)\\s*\\]" 

या

@"\\[ *([^\\]]+?) *\\]" 

ऊपर में रिक्त स्थान डालने में सावधानी रखें।

इस रिक्त स्थान पर कब्जा नहीं होगा: "?" NSLog उत्पादन
[नाम]
[पता]
[ज़िप]
[फ़ोन नंबर]

पूर्ववर्ती मेटा चरित्र गैर लालची, लालची डिफ़ॉल्ट है बनाता है।

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