2013-08-09 4 views
5

मैं उद्देश्य-सी में नियमित अभिव्यक्ति लिख रहा हूं। क्या करता है? (बैकस्लैश प्रश्न चिह्न) भागने का मतलब मतलब है?

बचने का अनुक्रम \w अवैध है और चेतावनी उत्सर्जित करता है, इसलिए नियमित अभिव्यक्ति /\w/ को @"\\w" के रूप में लिखा जाना चाहिए; एस्केप अनुक्रम \?valid, apparently, है और एक चेतावनी के उत्सर्जन नहीं करता है, इसलिए नियमित अभिव्यक्ति /\?/@"\\?" रूप में लिखा जा चाहिए (यानी, बैकस्लैश भाग निकले जाना चाहिए)।

प्रश्न अंक अदृश्य नहीं हैं \t या \n, तो \? एक वैध भागने अनुक्रम क्यों है?

संपादित करें: स्पष्ट करने के लिए, मैं, परिमाणक के बारे में पूछ नहीं कर रहा हूँ मैं एक स्ट्रिंग एस्केप अनुक्रम के बारे में पूछ रहा हूँ। यही कारण है, यह एक चेतावनी उत्सर्जन नहीं:

NSString *valid = @"\?"; 

इसके विपरीत, इस एक चेतावनी ("अज्ञात एस्केप अनुक्रम '\ w'") का उत्सर्जन करता है:

NSString *invalid = @"\w"; 
+0

इसका मतलब है कि आप मिलान करने की कोशिश कर रहे हैं (फ़ंक्शन के आधार पर) एक शाब्दिक '?'? – Jerry

+0

संभावित डुप्लिकेट [क्यों \ "है?" में एक एस्केप अनुक्रम C/C++?] (http://stackoverflow.com/questions/19374878/why-is-an-escape-sequence-in-cc) (ऑब्जेक्टिव-सी सी से इस सुविधा को विरासत में है, तो यह वास्तव में है एक डुप्लिकेट।) –

उत्तर

7

यह एक शाब्दिक प्रश्न चिह्न निर्दिष्ट करता है। trigraphs नामक छोटी-छोटी विशेषता के कारण इसकी आवश्यकता है, जहां आप एक और चरित्र को प्रतिस्थापित करने के लिए प्रश्न चिह्नों से शुरू होने वाले तीन-वर्ण अनुक्रम लिख सकते हैं। यदि आपके पास ट्रिगर सक्षम हैं, तो "??" लिखने के लिए एक स्ट्रिंग में, आपको इसे प्रीप्रोसेसर को ट्रिगर की शुरुआत के रूप में पढ़ने की कोशिश करने से रोकने के लिए "?\?" के रूप में लिखना होगा।

(आप सोच रहे हैं कि "क्यों किसी को भी इस तरह एक सुविधा को पेश होगा?":।। कुछ कीबोर्ड या वर्ण सेट { की तरह सामान्य रूप से प्रयुक्त प्रतीक शामिल नहीं था इसलिए उन्होंने trigraphs शुरू की है ताकि आप ??< बजाय लिख सकता है)

+1

अच्छा जवाब! ऐतिहासिक संदर्भ के लिए भी धन्यवाद। – smholloway

-1

? regex में एक क्वांटिफायर है, इसका मतलब है 0 या 1 अवसर। + या * क्वांटिफ़ायर में जोड़े जाने पर, यह इसे "आलसी" बनाता है।

उदाहरण के लिए, स्ट्रिंग foo? करने के लिए regex o? लागू करने o से मेल खाएगा।

हालांकि, foo? में regex o\?, o? से मेल खाते हैं, क्योंकि यह एक मनमाना परिमाणक के बजाय, स्ट्रिंग में एक शाब्दिक प्रश्न चिह्न के लिए खोज कर रहा है होगा।

रेगेक्स o*? से foo? लागू करना oo से मेल खाता है। परिमाणकों here पर

अधिक जानकारी।

+2

आपने मेरे प्रश्न को गलत समझा है। कृपया संपादन पढ़ें। – thomasd

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