एक उद्देश्य-सी कोको आवेदन में नियमित अभिव्यक्ति


173

प्रारंभिक Googling इंगित करता है कि एक उद्देश्य-सी कोको आवेदन में नियमित अभिव्यक्ति करने का कोई अंतर्निहित तरीका नहीं है।

तो चार सवाल:

  1. क्या यह सच है?

  2. क्या आप मेरे साथ मजाक कर रहे हैं?

  3. ठीक है, फिर एक अच्छा खुला स्रोत पुस्तकालय है जो आप सुझाते हैं?

  4. लाइब्रेरी को आयात किए बिना पर्याप्त पास पाने के तरीके क्या हैं, शायद एनएसएसकेनर वर्ग के साथ?


4
हम्म्म्म ... मुझे आश्चर्य है कि अगर आप मोनोटॉक का उपयोग करते हैं तो क्या होता है। प्रश्न के लिए +1।
दान रोसेनस्टार्क

जवाबों:



42
  1. हां, कोको में रेगेक्स सपोर्ट नहीं है। यदि आप केवल बूलियन मिलान में रुचि रखते हैं, तो आप NSPredicate का उपयोग कर सकते हैं जो ICU regex सिंटैक्स का समर्थन करता है। लेकिन आम तौर पर आप मैच की स्थिति या उपप्रकारों की स्थिति में रुचि रखते हैं, और आप इसे NSPredicate के साथ प्राप्त नहीं कर सकते।
  2. जैसा कि आप उल्लेख किया है आप regex POSIX फ़ंक्शन का उपयोग कर सकते हैं । लेकिन उन्हें धीमा माना जाता है, और रेगेक्स सिंटैक्स अन्य समाधानों (आईसीयू / पीसीआर ) की तुलना में सीमित है ।
  3. कई ओएसएस पुस्तकालय हैं, कोकोआडेव की एक व्यापक सूची है
  4. RegExKitLite उदाहरण के लिए किसी भी पुस्तकालयों की आवश्यकता नहीं है, बस .m और .h को अपनी परियोजना में जोड़ें।

    (RegExKitLite के खिलाफ मेरी शिकायत यह है कि यह श्रेणी के माध्यम से NSString का विस्तार करता है, लेकिन इसे एक विशेषता भी माना जा सकता है। यह ओएस के साथ शिप किए गए नॉन-रिपब्लिक ICU पुस्तकालयों का उपयोग करता है, जो Apple द्वारा अनुशंसित नहीं है।)


3
ध्यान रखें कि POSIX regex फ़ंक्शन यूनिकोड (ASCII केवल) के साथ काम नहीं करता है।
टॉम डेलिंग 23

FYI करें कि NSPredicate यूआरएल एक टूट कड़ी है
Taber

11
iOS खोज विकल्प के लिए नियमित अभिव्यक्ति का समर्थन करता है, जैसे[myString rangeOfString:@"regex_here" options:NSRegularExpressionSearch]
Nestor

1
सिंह (10.7) #if MAC_OS_X_VERSION_10_7 <= MAC_OS_X_VERSION_MAX_ALLOWED में भी उपलब्ध || __IPHONE_3_2 <= __IPHONE_OS_VERSION_MAX_ALLOWED
Maciej Swic

मुझे नॉनपब्लिक ICU लाइब्रेरीज़ का उपयोग करना ठीक लगता है, क्योंकि यदि आपको इसका उपयोग करने की आवश्यकता है, तो इसका कारण यह है कि कोको के आपके संस्करण में कोई अंतर्निहित regex समर्थन नहीं है। यदि आप उन पुस्तकालयों का उपयोग करते हैं, तो इसका मतलब यह भी है कि आप पुराने सिस्टम के लिए निर्माण कर रहे हैं, जो अब असमर्थित होने पर परिवर्तित नहीं होंगे। यदि आप पुराने और नए दोनों के लिए निर्माण कर रहे हैं, तो यदि आप NSRegularExpression मौजूद नहीं है, तो आप RegExKitLite को फॉलबैक के रूप में उपयोग करते हैं। (हां, अभी भी पुराने सिस्टम पर काम करने वाले लोग हैं)।

19

RegexKit सबसे अच्छा मैं अभी तक पाया है। बहुत कोको: y। मैं अपने कई iPhone ऐप में "लाइट" संस्करण का उपयोग कर रहा हूं:

sourceforge

lingonikorg


1
मैं दूसरा रेग्जिट लाइट। बहुत अच्छा!
डेव ड्रीबिन

1
कूल, जितने अधिक लोग इसका उपयोग करेंगे, उतना ही बेहतर होगा कि यह संभव हो जाएगा!
एवोकैड

12

आप POSIX रेगुलर एक्सप्रेशंस लाइब्रेरी (POSIX कंप्लेंट OS के लिए Yay) का उपयोग कर सकते हैं। प्रयत्न

man 3 regex

ओह मैं समझा। यह सीधे सी में करने का एक तरीका है, जो किसी भी उद्देश्य-सी ऐप में संभवतः काम करना चाहिए। धन्यवाद! यह मूल रूप से ऐसा करने का स्वीकृत तरीका है?
21

यह एक तरीका है, कि किसी भी अतिरिक्त निर्भरता की आवश्यकता नहीं है। अन्य स्रोत हैं, खुले स्रोत पुस्तकालयों के संदर्भ में जो आप आयात कर सकते हैं (पीसीआरई, पर्ल रेगेक्स के लिए, बूस्ट रेगेक्स लाइब्रेरी यदि आप ओब्ज-सी ++ का उपयोग कर रहे हैं, या अन्य उत्तरों में सूचीबद्ध अन्य)।
एडम राइट

उद्देश्य सी के साथ सीधे सी मिश्रण करने के लिए कोई नुकसान? क्या आप शायद NSString से और से परिवर्तित करने के लिए एक कोड स्निपेट शामिल कर सकते हैं? एक बार फिर धन्यवाद!
dreeves

Objective-C C के ऊपर बना है, इसलिए आप वास्तव में कुछ भी नहीं मिला रहे हैं। हालांकि, अधिकांश लोग एक पुस्तकालय का उपयोग करते हैं, क्योंकि यह एक एपीआई प्रदान करता है जिसका उपयोग करना आसान है।
मार्क चारबोन्यू

5
और क्योंकि POSIX regex फ़ंक्शन केवल ASCII स्ट्रिंग्स के साथ काम करता है।
टॉम डबलिंग 23

8

REGEX और JSON पार्सिंग मुद्दों को हल करने के लिए जो सस्ता और गंदा हैक समाधान मैं उपयोग करता हूं वह है एक UIWebView ऑब्जेक्ट बनाने और पार्स करने के लिए जावास्क्रिप्ट फ़ंक्शन (ओं) को इंजेक्ट करना। जावास्क्रिप्ट फ़ंक्शन तब मैं मान की एक स्ट्रिंग (या मूल्यों की सूची) लौटाता है। वास्तव में, आप विशेष कार्यों के लिए अनुकूलित कार्यों के एक छोटे से पुस्तकालय सेट को स्टोर कर सकते हैं और फिर उन्हें आवश्यकतानुसार कॉल कर सकते हैं।

मुझे नहीं पता कि यह तकनीक बार-बार पार्स करने के अनुरोधों के बड़े पैमाने पर चलती है, लेकिन त्वरित लेन-देन के सामान के लिए यह बिना किसी अतिरिक्त बाहरी संसाधनों या कोड के बिना किए गए कार्य को समझ सकता है।


7

मुझे AGRegex फ्रेमवर्क पसंद है जो PCRE का उपयोग करता है, यदि आप PCRE सिंटैक्स के लिए उपयोग किया जाता है। इस ढांचे का सबसे अच्छा संस्करण बोलचाल आईआरसी क्लाइंट में से एक है क्योंकि इसे पीसीआर 6.7 का उपयोग करने के लिए अपग्रेड किया गया है:

http://colloquy.info/project/browser/trunk/Frameworks/AGRegex

यह बहुत हल्का है, RegExKit की तुलना में बहुत अधिक (हालांकि पाठ्यक्रम के रूप में सक्षम नहीं है)।


यदि पूर्ण प्रति-संगत रेगेक्स है तो कम सक्षम क्यों?
4

संबंधित ऑब्जेक्टिव-सी हेल्पर विधियां लगभग रेगिट की तरह व्यापक नहीं हैं, हालांकि वे अधिकांश उद्देश्यों के लिए ठीक हैं।
रोब केनगर

6

NSRegularExpression मैक ओएस एक्स v10.7 और IOS 4.0 के बाद से उपलब्ध है।


5

इस विषय पर अपनी खोज के दौरान मैं कोकोआनिगुरुमा में आया , जो रूबी 1.9 और पीएचपी 5 के पीछे नियमित अभिव्यक्ति इंजन ओनिगुरुमा का उपयोग करता है। यह मौजूदा ओरेकलिट (जापानी में) की तुलना में थोड़ा नया लगता है । यकीन नहीं होता कि ये अन्य बाइंडिंग के खिलाफ कैसे खड़ी होती हैं।


4

Googling alittle, इस लाइब्रेरी को मिला: RegexOnNSString

ओपन सोर्स लाइब्रेरी, जैसे कार्य:

-(NSString *) stringByReplacingRegexPattern:(NSString *)regex withString:(NSString *) replacement caseInsensitive:(BOOL)ignoreCase

और NSRegularExpressionकक्षा का उपयोग कर । उपयोग में आसान और किसी भी चीज़ के बारे में चिंता करने की आवश्यकता नहीं है।

कृपया ध्यान दें, जो NSRegularExpressionमैक ओएस एक्स v10.7 और आईओएस 4.0 के बाद से उपलब्ध है, जैसा कि डेटास्मिड ने उल्लेख किया है।


1

मैं इसे आसान बनाता हूं। मैं अपने उद्देश्य सी प्रोजेक्ट में एक नई C ++ फ़ाइल जोड़ता हूं, इसे .mm के रूप में नाम देता हूं, और फिर एक मानक C ++ वर्ग अंदर बनाता हूं। फिर, मैं C ++ फ़ंक्शन के लिए "सार्वजनिक:" अनुभाग में एक स्थिर वर्ग विधि बनाता हूं जो NSString लेता है और एक NSString (या NSArray, यदि आप चाहते हैं तो) लौटाते हैं। मैं तो NSString को C ++ std :: string में परिवर्तित करता हूं:

// If anyone knows a more efficient way, let me know in the comments.
// The "if" condition below is because ObjC crashes if converting to
// std::string if the string is nil or empty.
// assume #include <string>
std::string s = "";
if (([sInput != nil]) && (!([sInput isEqualTo:@""]))) {
  std::string sTemp([sInput UTF8String]);
  s = sTemp;
}

वहाँ से, मैं regex_replace का उपयोग कर सकता हूँ जैसे:

// assume #include <regex>
std::string sResult = std::regex_replace(sSource,sRegExp,sReplaceWith);

फिर, मैं उस std :: string को वापस NSString में बदल सकता हूँ:

NSString *sResponse2 = @(sResult.c_str());

यदि आप केवल इस फ़ंक्शन के लिए केवल C ++ का उपयोग कर रहे हैं, तो आप इस फ़ाइल को अतिरिक्त कॉल करने के लिए उपयुक्त पा सकते हैं। मिमी (वर्ग नाम अतिरिक्त) और इस स्थिर वर्ग विधि को अंदर रखें, और फिर स्थिति आने पर अन्य स्थिर वर्ग विधियों को जोड़ें। जहां यह सिर्फ C ++ में करने के लिए समझ में आता है क्योंकि यह कुछ मामलों में कम परेशानी है। (ऐसे मामले हैं जहां ओबीजीसी कोड की कम लाइनों के साथ कुछ करता है, और कुछ मामलों में जहां सी ++ कोड की कम लाइनों के साथ करता है।)

पुनश्च अभी भी इसके साथ एक और तरीका है एक .mm फ़ाइल का उपयोग करें, लेकिन std :: string और std :: regex_replace () (या regex_match ()) के उपयोग के आसपास एक उद्देश्य C आवरण बनाएं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.