जेमी ज़्विन्स्की का एक लोकप्रिय उद्धरण है :
कुछ लोग, जब एक समस्या का सामना करते हैं, तो सोचते हैं "मुझे पता है, मैं नियमित अभिव्यक्ति का उपयोग करूंगा।" अब उन्हें दो समस्याएं हैं।
इस उद्धरण को कैसे समझा जाना चाहिए?
जेमी ज़्विन्स्की का एक लोकप्रिय उद्धरण है :
कुछ लोग, जब एक समस्या का सामना करते हैं, तो सोचते हैं "मुझे पता है, मैं नियमित अभिव्यक्ति का उपयोग करूंगा।" अब उन्हें दो समस्याएं हैं।
इस उद्धरण को कैसे समझा जाना चाहिए?
जवाबों:
कुछ प्रोग्रामिंग प्रौद्योगिकियों को आमतौर पर प्रोग्रामर ( नियमित अभिव्यक्ति , फ्लोटिंग पॉइंट , पर्ल , एडब्ल्यूके , आईओसी ... और अन्य ) द्वारा अच्छी तरह से नहीं समझा जाता है ।
समस्याओं के सही सेट को हल करने के लिए ये आश्चर्यजनक शक्तिशाली उपकरण हो सकते हैं। विशेष रूप से नियमित अभिव्यक्ति नियमित भाषाओं के मिलान के लिए बहुत उपयोगी है। और समस्या की जड़ है: कुछ लोग जानते हैं कि एक नियमित भाषा का वर्णन कैसे किया जाता है (यह कंप्यूटर विज्ञान सिद्धांत / भाषा विज्ञान का हिस्सा है जो अजीब प्रतीकों का उपयोग करता है - आप इसके बारे में चोमस्की पदानुक्रम में पढ़ सकते हैं )।
इन चीजों के साथ काम करते समय, यदि आप उन्हें गलत तरीके से इस्तेमाल करते हैं, तो यह संभावना नहीं है कि आपने वास्तव में अपनी मूल समस्या को हल कर लिया है। HTML (एक बहुत सामान्य घटना) से मेल खाने के लिए एक नियमित अभिव्यक्ति का उपयोग करने का मतलब होगा कि आप किनारे के मामलों को याद करेंगे । और अब, आपको अभी भी मूल समस्या है जिसे आपने हल नहीं किया है, और एक और सूक्ष्म बग जो तैर रहा है उसे गलत समाधान का उपयोग करके पेश किया गया है।
यह कहना नहीं है कि नियमित अभिव्यक्तियों का उपयोग नहीं किया जाना चाहिए, बल्कि यह समझने के लिए काम करना चाहिए कि वे उन समस्याओं का क्या सेट कर सकते हैं जिन्हें वे हल कर सकते हैं और उन्हें विवेकपूर्ण तरीके से हल नहीं कर सकते हैं।
सॉफ्टवेयर को बनाए रखने की कुंजी बनाए रखने योग्य कोड लिख रही है। नियमित अभिव्यक्तियों का उपयोग करके उस लक्ष्य का सामना किया जा सकता है। नियमित अभिव्यक्तियों के साथ काम करते समय, आपने एक विशेष डोमेन विशिष्ट भाषा में एक मिनी कंप्यूटर (विशेष रूप से एक गैर-नियतात्मक परिमित राज्य ऑटोमेटन ) लिखा है । इस भाषा में 'हैलो वर्ल्ड' के बराबर लिखना और उसमें विवेकपूर्ण आत्मविश्वास हासिल करना आसान है, लेकिन आगे जाकर अतिरिक्त बग्स को लिखने से बचने के लिए नियमित भाषा की समझ के साथ संयम रखने की जरूरत है, जिसे पहचानना और ठीक करना बहुत मुश्किल हो सकता है (क्योंकि वे उस कार्यक्रम का हिस्सा नहीं हैं जो नियमित अभिव्यक्ति में है)।
तो अब आपको एक नई समस्या मिल गई है; आपने इसे (जब यह अनुचित है) को हल करने के लिए नियमित अभिव्यक्ति के उपकरण को चुना, और आपको अब दो बग मिल गए हैं, दोनों को ढूंढना कठिन है, क्योंकि वे अमूर्त की एक और परत में छिपे हुए हैं।
नियमित अभिव्यक्तियाँ - विशेष रूप से गैर तुच्छ व्यक्ति - कोड को समझना, बनाए रखना और बनाना मुश्किल हैं। आपको केवल स्टैक ओवरफ्लो पर प्रश्नों की संख्या को देखना होगा [regex]
जहां प्रश्नकर्ता ने यह मान लिया है कि उनकी समस्या का उत्तर एक रेगेक्स है और बाद में अटक गया है। बहुत सारे मामलों में समस्या (और शायद) को एक अलग तरीके से हल किया जा सकता है।
इसका मतलब यह है कि, यदि आप एक रेगेक्स का उपयोग करने का निर्णय लेते हैं, तो आपको दो समस्याएं हैं:
असल में, मुझे लगता है कि उसका मतलब है कि आपको केवल रेगेक्स का उपयोग करना चाहिए यदि आपकी समस्या को हल करने का कोई अन्य तरीका नहीं है। एक और उपाय शायद कोड, रखरखाव और समर्थन को आसान बनाने वाला है। यह धीमा या कम कुशल हो सकता है, लेकिन यदि यह रखरखाव और समर्थन की महत्वपूर्ण आसानी नहीं है, तो यह चिंता का विषय होना चाहिए।
यह ज्यादातर एक जीभ-इन-गाल मजाक है, भले ही सच्चाई का एक अनाज है।
कुछ कार्य हैं जिनके लिए नियमित अभिव्यक्ति एक उत्कृष्ट फिट है। मैंने एक बार एक नियमित अभिव्यक्ति के साथ मैन्युअल रूप से लिखित पुनरावर्ती वंश पार्सर कोड की 500 पंक्तियों को बदल दिया, जो पूरी तरह से डिबग करने में लगभग 10 मिनट लगते थे। लोगों का कहना है कि रेग्जेस को समझना और डिबग करना कठिन है, लेकिन उचित रूप से लागू लोगों को लगभग हाथ से तैयार किए गए पार्सर के रूप में डिबग करना उतना मुश्किल नहीं है। मेरे उदाहरण में, गैर-रेगेक्स समाधान के सभी किनारे मामलों को डिबग करने में दो सप्ताह का समय लगा।
हालांकि, अंकल बेन को खुश करने के लिए:
बड़ी स्पष्टता के साथ बड़ी जिम्मेदारी आती है।
दूसरे शब्दों में, रेगेक्स आपकी भाषा में अभिव्यक्तता को जोड़ता है, लेकिन जो प्रोग्रामर पर किसी दिए गए कार्य के लिए सबसे पठनीय मोड चुनने के लिए अधिक जिम्मेदारी डालता है।
कुछ चीजें शुरू में नियमित अभिव्यक्ति के लिए एक अच्छे काम की तरह दिखती हैं, लेकिन ऐसा नहीं है। उदाहरण के लिए, नेस्टेड टोकन के साथ कुछ भी, जैसे HTML। कभी-कभी लोग एक सरल अभिव्यक्ति का उपयोग करते हैं जब एक सरल विधि अधिक स्पष्ट होती है। उदाहरण के लिए, string.endsWith("ing")
बराबर रेगेक्स की तुलना में समझना आसान है। कभी-कभी लोग एक बड़ी समस्या को एक एकल रेगेक्स में रटने की कोशिश करते हैं, जहां इसे टुकड़ों में तोड़ना अधिक उचित होता है। कभी-कभी लोग एक ही काम करने के लिए एक अच्छी तरह से नामित फ़ंक्शन बनाने के बजाय, एक रेगेक्स को बार-बार दोहराते हुए उचित सार बनाने में विफल होते हैं (शायद आंतरिक रूप से एक रेगेक्स के साथ लागू किया जाता है)।
किसी कारण के लिए, regexes के पास एकल जिम्मेदारी और DRY जैसे सामान्य सॉफ्टवेयर इंजीनियरिंग सिद्धांतों के लिए एक अंधे स्थान बनाने की एक अजीब प्रवृत्ति है। इसलिए कई बार प्यार करने वाले लोग भी उन्हें समस्याग्रस्त पाते हैं।
जेफ एटवुड ने एक ब्लॉग पोस्ट में इस बहुत ही उद्धरण पर चर्चा करते हुए एक अलग व्याख्या पेश की: रेगुलर एक्सप्रेशंस: अब आपको दो समस्याएं हैं ( लिंक के लिए यूफोरिक का धन्यवाद )
1997 के मूल में जेमी के पदों के पूर्ण पाठ का विश्लेषण करते हुए, हम निम्नलिखित पाते हैं:
पर्ल की प्रकृति लगभग सभी अन्य तकनीकों के बहिष्करण के लिए नियमित अभिव्यक्ति के उपयोग को प्रोत्साहित करती है; वे बिंदु A से बिंदु B पर जाने के लिए सबसे अधिक "स्पष्ट" (कम से कम, ऐसे लोगों को, जो किसी भी बेहतर नहीं जानते हैं) से दूर हैं।
पहली बोली को भी गंभीरता से लिया जाना चाहिए। लेकिन यह, मैं पूरी तरह से सहमत हूं। यहाँ बिंदु जेमी बनाने की कोशिश कर रहा था: ऐसा नहीं है कि नियमित अभिव्यक्तियाँ बुराई हैं, प्रति se, लेकिन नियमित अभिव्यक्ति का अति प्रयोग बुराई है।
यहां तक कि अगर आप करते हैं पूरी तरह से नियमित अभिव्यक्ति को समझते हैं, आप में चलाने गोल्डन हथौड़ा समस्या, नियमित अभिव्यक्ति, के साथ एक समस्या को हल करने की कोशिश कर रहा है जब यह आसान और अधिक नियमित रूप से कोड के साथ एक ही बात करने के लिए (यह भी देखें स्पष्ट हो गया होता CodingHorror: regex का उपयोग बनाम रेगेक्स दुरुपयोग )।
एक और ब्लॉग पोस्ट है जो उद्धरण के संदर्भ में दिखता है, और एटवुड की तुलना में अधिक विवरण में है: जेफरी फ्रिडल का ब्लॉग: प्रसिद्ध "अब आपको दो समस्याएं हैं" स्रोत
इस उद्धरण के साथ कुछ बातें चल रही हैं।
बोली एक पहले मजाक के एक restatement है:
जब भी किसी समस्या का सामना करना पड़ता है, तो कुछ लोग कहते हैं "आओ AWK का उपयोग करें।" अब, उन्हें दो समस्याएं हैं। - डी। तिलब्रुक
यह एक मज़ाक और वास्तविक खुदाई है, लेकिन यह रेगेक्स को एक बुरे समाधान के रूप में उजागर करने का भी एक तरीका है, इसे अन्य बुरे समाधानों के साथ जोड़कर। यह एक महान हा हा केवल गंभीर क्षण है।
मेरे लिए - आपको ध्यान में रखते हुए, यह उद्धरण व्याख्या के लिए जानबूझकर खुला है - अर्थ सीधे आगे है। बस एक नियमित अभिव्यक्ति का उपयोग करने के विचार की घोषणा करने से समस्या हल नहीं हुई है। इसके अलावा, आपने नियमों के साथ एक अतिरिक्त भाषा जोड़कर कोड की संज्ञानात्मक जटिलता को बढ़ा दिया है जो आप जिस भी भाषा का उपयोग कर रहे हैं उससे अलग खड़े हैं।
यद्यपि एक मजाक के रूप में अजीब है, आपको रेगेक्स समाधान की जटिलता के साथ गैर-रेगेक्स समाधान की जटिलता की तुलना करने की आवश्यकता है + रीजेक्स सहित अतिरिक्त जटिलता। Regexes जोड़ने की अतिरिक्त लागत के बावजूद, एक रेगेक्स के साथ समस्या को हल करना सार्थक हो सकता है।
RegularExpressionsarenoworsetoreadormaintainthananyotherunformattedcontent; indeedaregexisprobablyeasiertoreadthanthispieceoftexthere-butunfortunatelytheyhaveabadreputationbecausesomeimplementationsdon'tallowformattingandpeopleingeneraldon'tknowthatyoucandoit।
(रेगुलर एक्सप्रेशंस पढ़ने या किसी अन्य अनफ़ॉर्मेंट कंटेंट को बनाए रखने के लिए बदतर नहीं हैं; वास्तव में एक रेगेक्स शायद यहाँ पाठ के इस टुकड़े की तुलना में पढ़ना आसान है - लेकिन दुर्भाग्य से उनकी एक खराब प्रतिष्ठा है क्योंकि कुछ कार्यान्वयन सामान्य रूप से प्रारूपण और लोगों को अनुमति नहीं देते हैं यह नहीं जानते कि आप इसे कर सकते हैं।)
यहाँ एक तुच्छ उदाहरण दिया गया है:
^(?:[^,]*+,){21}[^,]*+$
जो वास्तव में वैसे भी पढ़ना या बनाए रखना मुश्किल नहीं है, लेकिन जब यह इस तरह दिखता है तो और भी आसान है:
(?x) # enables comments, so this whole block can be used in a regex.
^ # start of string
(?: # start non-capturing group
[^,]*+ # as many non-commas as possible, but none required
, # a comma
) # end non-capturing group
{21} # 21 of previous entity (i.e. the group)
[^,]*+ # as many non-commas as possible, but none required
$ # end of string
यह एक ओवर-द-टॉप उदाहरण का एक सा है (टिप्पणी $
करना टिप्पणी के समान है i++
) लेकिन स्पष्ट रूप से इसे पढ़ने, समझने और बनाए रखने में कोई समस्या नहीं होनी चाहिए।
जब तक आप स्पष्ट रूप से स्पष्ट नहीं हो जाते हैं कि नियमित अभिव्यक्तियाँ कब अनुकूल होती हैं और जब वे एक बुरे विचार के होते हैं, तो उनके साथ कुछ भी गलत नहीं होता है, और ज्यादातर बार JWZ उद्धरण वास्तव में लागू नहीं होता है।
*+
? कैसे है कि किसी भी अलग (कार्यात्मक) बस से *
?
*+
इस मामले में करने का कोई मतलब नहीं है ; सब कुछ लंगर है और एक ऑटोनॉटन द्वारा एक एकल पास में मिलान किया जा सकता है जो 22 तक गिना जा सकता है। उन गैर-अल्पविराम सेटों पर सही संशोधक सिर्फ सादे पुराना है *
। (क्या अधिक है, यहां लालची और गैर-लालची मिलान एल्गोरिदम के बीच कोई अंतर नहीं होना चाहिए। यह एक बहुत ही सरल मामला है।)
क्रिसफ के जवाब के अलावा - वह नियमित अभिव्यक्ति "कोड को समझना, समझना और बनाए रखना मुश्किल है", इससे भी बदतर है: वे बस शक्तिशाली हैं जो लोगों को उन चीजों को पार्स करने के लिए उपयोग करने की कोशिश कर रहे हैं जो उन्हें नहीं मिल सकती हैं, जैसे कि HTML। SO पर "मैं HTML को पार्स कैसे करूं?" पर कई प्रश्न देखें। उदाहरण के लिए, SO में सभी का सबसे अधिक महाकाव्य उत्तर !
नियमित अभिव्यक्ति बहुत शक्तिशाली है, लेकिन उनके पास एक छोटी और एक बड़ी समस्या है; वे लिखना कठिन है, और पढ़ने के लिए असंभव है।
सबसे अच्छे मामले में नियमित अभिव्यक्ति का उपयोग समस्या को हल करता है, इसलिए तब आपको केवल जटिल कोड के रखरखाव की समस्या होती है। अगर आपको नियमित अभिव्यक्ति सही नहीं मिलती है, तो आपके पास मूल समस्या और बिना पढ़े कोड वाले समस्या दोनों हैं।
कभी-कभी नियमित अभिव्यक्तियों को केवल-लेखन कोड के रूप में संदर्भित किया जाता है। एक नियमित अभिव्यक्ति का सामना करना पड़ता है जिसे फिक्सिंग की आवश्यकता होती है, यह अभिव्यक्ति को समझने की कोशिश करने की तुलना में खरोंच से शुरू करना अक्सर तेज होता है।
समस्या यह है कि रेगेक्स एक जटिल जानवर है, और आप केवल अपनी समस्या का समाधान करते हैं यदि आप रेगेक्स का पूरी तरह से उपयोग करते हैं। यदि आप नहीं करते हैं, तो आप 2 समस्याओं को समाप्त करते हैं: आपकी मूल समस्या और regex।
आप दावा करते हैं कि यह कोड की सौ लाइनों का काम कर सकता है, लेकिन आप यह तर्क भी दे सकते हैं कि स्पष्ट, संक्षिप्त कोड की 100 लाइनें रेगेक्स की एक पंक्ति से बेहतर हैं।
यदि आपको इसके कुछ प्रमाण की आवश्यकता है: आप इस एसओ क्लासिक की जांच कर सकते हैं या एसओ रेगेक्स टैग के माध्यम से कंघी कर सकते हैं
अर्थ के दो भाग हैं:
जैसा कि आप 2014 में पूछते हैं, 1997 की संदर्भ की प्रोग्रामिंग भाषाओं पर विचार करना दिलचस्प होगा, जो आज के संदर्भ की तुलना में है। मैं यहां इस बहस में प्रवेश नहीं करूंगा लेकिन पर्ल और पर्ल के बारे में राय बहुत बदल गई है।
हालाँकि, 2013 के संदर्भ में बने रहने के लिए ( डे ल'ए ए कपे सूस लेस पॉन्स उपसर्ग), मैं एक प्रसिद्ध एक्सकेसीडी कॉमिक का उपयोग करते हुए उद्धरणों में पुनर्वित्त पर ध्यान केंद्रित करने का सुझाव दूंगा जो कि जेमी ज़ावास्की की एक सीधी बोली है :
पहले मुझे इस कॉमिक को समझने में समस्या हुई क्योंकि यह ज़्वॉन्स्की बोली का संदर्भ था, और जे-ज़ी गीत के बोल का एक उद्धरण और जीएनयू program --help -z
ध्वज 2 का एक संदर्भ था, इसलिए, इसे समझना मेरे लिए बहुत अधिक संस्कृति थी।
मुझे पता था कि यह मजेदार था, मैं इसे महसूस कर रहा था, लेकिन मुझे वास्तव में पता नहीं था कि क्यों। लोग अक्सर पर्ल और रीगेक्स के बारे में चुटकुले कर रहे हैं, खासकर जब से यह सबसे हिपस्टेस्ट प्रोग्रामिंग भाषा नहीं है, वास्तव में यह नहीं जानता कि इसे मज़ेदार क्यों माना जाता है ... शायद इसलिए कि पर्ल मूंगर्स मूर्खतापूर्ण बातें करते हैं ।
तो आरंभिक उद्धरण वास्तविक जीवन की समस्याओं (दर्द?) पर आधारित एक व्यंग्यात्मक मजाक लगता है, जो चोट पहुँचाने वाले उपकरणों के साथ प्रोग्रामिंग के कारण होता है। जैसे एक हथौड़ा एक राजमिस्त्री को चोट पहुंचा सकता है, ऐसे उपकरणों के साथ प्रोग्रामिंग जो कि एक डेवलपर नहीं है यदि वह चुन सकता है कि क्या वह (मस्तिष्क, भावनाओं) को चोट पहुंचा सकता है। कभी-कभी, इस बात पर बड़ी बहस होती है कि कौन सा उपकरण सबसे अच्छा है, लेकिन यह लगभग बेकार कारण है यह आपके स्वाद या आपके प्रोग्रामिंग टीम के स्वाद , सांस्कृतिक या आर्थिक कारणों की समस्या है। इसके बारे में एक और उत्कृष्ट XKCD हास्य:
मैं समझ सकता हूं कि लोग रेक्सक्स के बारे में दर्द महसूस कर रहे हैं, और वे मानते हैं कि रेग्क्स के लिए डिज़ाइन किए गए एक और उपकरण बेहतर है। जैसा कि @ karl-bielefeldt आपके प्रश्न का उत्तर बड़ी स्पष्टता के साथ देता है बड़ी जिम्मेदारी आती है , और regexes विशेष रूप से इससे चिंतित हैं। यदि कोई डेवलपर इस बात की परवाह नहीं करता है कि वह एस-रेगेस के साथ कैसा व्यवहार करता है, तो यह अंततः उन लोगों के लिए दर्द होगा जो बाद में कोड बनाए रखेंगे।
मैं दामियन कॉन एव्स पेरल बेस्ट प्रैक्टिसेज (2005 की एक किताब) से एक विशिष्ट उदाहरण दिखाते हुए उद्धरण के बारे में इस जवाब के साथ समाप्त करूंगा ।
वह बताते हैं कि इस तरह एक पैटर्न लिखना:
m{'[^\\']*(?:\\.[^\\']*)*'}
... इस तरह एक कार्यक्रम लिखने से ज्यादा स्वीकार्य नहीं है :
sub'x{local$_=pop;sub'_{$_>=$_[0
]?$_[1]:$"}_(1,'*')._(5,'-')._(4
,'*').$/._(6,'|').($_>9?'X':$_>8
?'/':$")._(8,'|').$/._(2,'*')._(
7,'-')._(3,'*').$/}print$/x($=).
x(10)x(++$x/10).x($x%10)while<>;
लेकिन इसे फिर से लिखा जा सकता है , यह अभी भी सुंदर नहीं है, लेकिन कम से कम अब यह जीवित है।
# Match a single-quoted string efficiently...
m{ ' # an opening single quote
[^\\']* # any non-special chars (i.e., not backslash or single quote)
(?: # then all of...`
\\ . # any explicitly backslashed char
[^\\']* # followed by any non-special chars
)* # ...repeated zero or more times
' # a closing single quote
}x
आयताकार आकार कोड इस प्रकार का है दूसरा नहीं समस्या regexes कि एक स्पष्ट, पोषणीय और पठनीय तरीके से प्रारूपित किया जा सकता है।
/* Multiply the first 10 values in an array by 2. */ for (int i = 0 /* the loop counter */; i < 10 /* continue while it is less than 10 */; ++i /* and increment it by 1 in each iteration */) { array[i] *= 2; /* double the i-th element in the array */ }
अगर कंप्यूटर विज्ञान से कोई एक चीज सीखनी चाहिए, तो वह है चोमस्की पदानुक्रम । मैं कहूंगा कि नियमित अभिव्यक्ति के साथ सभी समस्याएं संदर्भ-मुक्त व्याकरण के साथ पार्स करने के प्रयासों से आती हैं। जब आप सीएफजी में घोंसले के स्तर के लिए एक सीमा लगा सकते हैं (या सोच सकते हैं कि आप एक सीमा लगा सकते हैं), तो आप उन लंबी और जटिल नियमित अभिव्यक्तियों को प्राप्त करते हैं।
पूर्ण पैमाने पर पार्सिंग की तुलना में नियमित अभिव्यक्ति टोकन के लिए अधिक उपयुक्त है।
लेकिन, चीजों का आश्चर्यजनक रूप से बड़ा सेट जो प्रोग्रामर को पार्स करने की आवश्यकता है, वे एक नियमित भाषा (या इससे भी बदतर, एक नियमित भाषा द्वारा लगभग पार्स करने योग्य हैं और यदि आप केवल थोड़ा और कोड लिखते हैं ...)।
इसलिए यदि किसी को "अहा, आदत है, तो मुझे अलग से पाठ लेने की आवश्यकता है, मैं एक नियमित अभिव्यक्ति का उपयोग करूंगा", उस मार्ग से नीचे जाना आसान है, जब आपको किसी ऐसी चीज की आवश्यकता होती है जो पुश-डाउन ऑटोमेटन, सीएफजी पार्सर के करीब हो या और भी शक्तिशाली व्याकरण। वह आमतौर पर आँसू में समाप्त होता है।
इसलिए, मुझे लगता है कि बोली इतनी अधिक स्लेजिंग रेपेक्स नहीं है, उनके पास उनका उपयोग (और अच्छी तरह से उपयोग किया जाता है, वे वास्तव में बहुत उपयोगी हैं), लेकिन रीजैक्स पर निर्भरता (या, विशेष रूप से, उनके बारे में अलौकिक विकल्प) ।
jwz बस उस उद्धरण के साथ अपने घुमाव छोड़ रहा है। नियमित अभिव्यक्तियाँ किसी भी भाषा की विशेषता से अलग नहीं हैं - आसान पेंच करना, कठिनता से उपयोग करना, समय पर शक्तिशाली, कई बार अनुचित, अक्सर अच्छी तरह से प्रलेखित, अक्सर उपयोगी।
फ्लोटिंग पॉइंट अंकगणित, क्लोजर, ऑब्जेक्ट-ओरिएंटेशन, एसिंक्रोनस I / O के लिए भी यही कहा जा सकता है, या कुछ और जो आप नाम दे सकते हैं। अगर आपको नहीं पता कि आप क्या कर रहे हैं, तो प्रोग्रामिंग लैंग्वेज आपको दुखी कर सकती है।
यदि आपको लगता है कि regexes को पढ़ना मुश्किल है, तो प्रश्न में पैटर्न के उपभोग के लिए बराबर पार्सर कार्यान्वयन को पढ़ने की कोशिश करें। अक्सर रेगेक्स जीतते हैं क्योंकि वे पूर्ण पार्सर की तुलना में अधिक कॉम्पैक्ट होते हैं ... और ज्यादातर भाषाओं में, वे तेजी से भी होते हैं।
नियमित अभिव्यक्ति (या किसी अन्य भाषा सुविधा) का उपयोग करने से बचे नहीं क्योंकि एक स्व-प्रचारक ब्लॉगर अयोग्य कथन करता है। चीजों को अपने लिए आज़माएँ और देखें कि आपके लिए क्या काम करता है।
मेरे पसंदीदा, इन-डेप्थ उत्तर, प्रसिद्ध रोब पाइक द्वारा एक आंतरिक Google कोड टिप्पणी से पुन: प्रस्तुत ब्लॉग पोस्ट में दिए गए हैं: http://commandcenter.blogspot.ch/2011/08/ अनियमित-expressions-in-lexing- and.html
सारांश यह है कि ऐसा नहीं है कि वे खराब हैं , लेकिन वे अक्सर उन कार्यों के लिए उपयोग किए जाते हैं जिन्हें वे आवश्यक रूप से अनुकूल नहीं हैं, खासकर जब यह कुछ इनपुट को लेक्सिंग और पार्स करने की बात आती है।
नियमित अभिव्यक्ति को लिखना मुश्किल है, अच्छी तरह से लिखना मुश्किल है, और अन्य प्रौद्योगिकियों के सापेक्ष महंगा हो सकता है ... दूसरी तरफ, लेक्सर्स, सही ढंग से लिखने के लिए काफी आसान हैं (यदि कॉम्पैक्ट रूप में नहीं), और परीक्षण करना बहुत आसान है। अल्फ़ान्यूमेरिक पहचानकर्ता खोजने पर विचार करें। रीजेक्सप ("[a-ZA-Z _] [[a-ZA-Z_0-9] *") लिखना बहुत कठिन नहीं है, लेकिन वास्तव में सरल लूप के रूप में लिखना ज्यादा कठिन नहीं है। लूप का प्रदर्शन, हालांकि, बहुत अधिक होगा और इसमें कवर के नीचे बहुत कम कोड शामिल होंगे। एक नियमित अभिव्यक्ति पुस्तकालय एक बड़ी बात है। एक पार्स आइडेंटिफ़ायर का उपयोग करना दूध की दुकान पर जाने के लिए फेरारी का उपयोग करने जैसा है।
वह इससे बहुत अधिक कहते हैं, यह तर्क देते हुए कि नियमित रूप से उपयोगी हैं, जैसे कि पाठ संपादकों में पैटर्न के डिस्पोजेबल मिलान लेकिन शायद ही कभी संकलित कोड में उपयोग किया जाना चाहिए, और इसी तरह। यह पढ़ने लायक है।
यह एलन पर्लीस के एपिग्राम # 34 से संबंधित है:
स्ट्रिंग एक स्टार्क डेटा संरचना है और हर जगह इसे पारित किया जाता है प्रक्रिया की बहुत दोहराव है। यह जानकारी छिपाने के लिए एक आदर्श वाहन है।
इसलिए यदि आप अपने डेटा संरचना के रूप में चरित्र स्ट्रिंग का चयन करते हैं (और, स्वाभाविक रूप से, regex- आधारित कोड एल्गोरिदम के रूप में इसे हेरफेर करने के लिए), तो आपको एक समस्या है, भले ही यह काम करता है: डेटा के अनुचित प्रतिनिधित्व के आसपास खराब डिजाइन जो कि मुश्किल है विस्तार और अक्षम।
हालांकि, अक्सर यह काम नहीं करता है: मूल समस्या हल नहीं होती है, और इसलिए उस मामले में आपको दो समस्याएं हैं।
त्वरित और गंदे पाठ पार्सिंग के लिए रेगेक्स का व्यापक रूप से उपयोग किया जाता है। वे पैटर्न व्यक्त करने के लिए एक महान उपकरण हैं जो केवल एक सादे स्ट्रिंग मैच की तुलना में थोड़ा अधिक जटिल हैं।
हालाँकि रेगेक्स को और अधिक जटिल सर्पिल मुद्दे मिलते हैं जो अपना सिर उठाते हैं।
इस प्रकार यह सब बहुत आसान है एक टेक्स्ट प्रोसेसिंग प्रॉब्लम के साथ शुरू करना, उस पर रेगुलर एक्सप्रेशन लागू करना और दो प्रॉब्लम को खत्म करना, आप जिस ऑरिजिनल प्रॉब्लम को सॉल्व करने की कोशिश कर रहे हैं और जो रेग्युलर एक्सप्रेशंस सॉल्व करने की कोशिश कर रहे हैं (सही तरीके से सॉल्व नहीं कर रहे हैं)। मूल समस्या।