दिलचस्प पोस्ट
एंड्रॉइड से नेट वेब सेवा को कैसे कॉल करें? PHP में सुरक्षित ऑटो लॉगिन कुकी सिस्टम डिजाइन करना कैसे example_eval काम करता है और क्यों DHH इसे नफरत करता है? नि: शुल्क यूएमएल अनुक्रम आरेख बॉक्स रिवर्स इंजीनियरिंग ग्रहण प्लगइन बॉक्स से बाहर काम करता है – क्या ऐसी कोई बात मौजूद है? स्विफ्ट ऑब्जेक्ट में JSON / NSDictionary को डीसरियल करें सी # विभाजन स्ट्रिंग लेकिन विभाजित वर्ण / विभाजक रखने के लिए आप ASP.NET MVC में अधिभार नियंत्रक विधियों कर सकते हैं? बैकरेन्फ़िकेशन इन लेकबीहैंड क्या std :: नक्शा ज्ञात (और मानक द्वारा गारंटीकृत) के माध्यम से पुनरावृत्त करने का क्रम है? यूडीआईडी ​​और यूयूआईडी के बीच मतभेद पायथन: एक धारा के लिए एक थकावट परिवर्तित? <Ui: repeat> के भीतर तत्व की सशर्त रेंडरिंग निर्दिष्ट करें? <C: if> काम करने के लिए प्रतीत नहीं होता है गाऊसी ब्लर ऑन होवर jQuery का उपयोग करना कैसे आंशिक सेकंड के साथ POSIXct स्वरूपण सीएसएस फ़ाइलों के ब्राउज़र कैशिंग

जब सी # (या जावा, सी ++, इत्यादि) में रेगेक्स का उपयोग न करें

यह स्पष्ट है कि बहुत सी समस्याएं हैं जो सरल regex अभिव्यक्ति की तरह दिखती हैं, लेकिन जो regex के साथ हल करने के लिए बहुत मुश्किल साबित होती हैं।

तो फिर कोई व्यक्ति जो रैगेक्स में एक विशेषज्ञ नहीं है , पता है कि क्या उसे किसी समस्या को हल करने के लिए रेगेक्स सीखना चाहिए?

( "मैं सभी प्रश्नों को खोजने के लिए सी # स्रोत कोड को पार्स करने के लिए रीगेक्स" देखें, इस तरह से मैं यह सवाल पूछ रहा हूं।)

ऐसा लगता है कि यह अच्छी तरह से बताता है:

कुछ लोगों को, जब एक समस्या का सामना करना पड़ता है, तो लगता है "मुझे पता है, मैं नियमित अभिव्यक्ति का उपयोग करूँगा ।" अब उन्हें दो समस्याएं हैं …

(मैंने इस प्रश्न का शीर्षक भी बदल दिया है ताकि इसे और अधिक विशिष्ट बनाया जा सके, क्योंकि रीजक्स में सी # के साथ समस्याओं में से कुछ को पर्ल और जेस्क्रिप्ट में हल किया जाता है, उदाहरण के लिए उद्धरण के दो स्तर रेगेक्स को इतना अपठनीय बनाता है।)

Solutions Collecting From Web of "जब सी # (या जावा, सी ++, इत्यादि) में रेगेक्स का उपयोग न करें"

प्रोग्राम स्रोत (या नेस्टेड एक्सएमएल) जैसे पदानुक्रमित पाठ को पार्स करने के लिए regex का उपयोग करने की कोशिश न करें: उदाहरण के लिए, वे पैरों की एक स्ट्रिंग के लिए नहीं कर सकते हैं, यह पता लगा सकते हैं कि क्या वे ' फिर संतुलित या नहीं

इसके लिए पार्सर जनरेटर (या समान प्रौद्योगिकियों) का उपयोग करें

साथ ही, मैं ई-मेल पते जैसे सख्त औपचारिक मानकों के साथ डेटा को मान्य करने के लिए regex का उपयोग करने की अनुशंसा नहीं करता था। वे जितना चाहें उतना कठिन हैं, और आप या तो अमान्य हो या बहुत लंबे समय तक regex।

इस पर विचार करने के लिए दो पहलू हैं:

  • क्षमता: वह भाषा है जिसे आप टाइप-3 भाषा (एक नियमित एक) को पहचानने की कोशिश कर रहे हैं? यदि हां, तो आप regex का उपयोग कर सकते हैं, यदि नहीं, तो आपको एक अधिक शक्तिशाली उपकरण की आवश्यकता है

  • रखरखाव योग्यता: यदि इसे अधिक समय लगता है, प्रोग्राम लिखने की जांच करें और इसके प्रोग्रामेटिक समकक्ष से नियमित अभिव्यक्ति को समझें, तो यह उपयुक्त नहीं है। यह कैसे जटिल है, मैं अपने साथियों (यदि वे कहते हैं, "क्या …" जब वे इसे देखते हैं, तो यह बहुत जटिल है) के साथ सहकर्मी की समीक्षा की अनुशंसा करते हैं या बस इसे कुछ दिनों के लिए अनुपयुक्त छोड़ दें और फिर एक अपने आप को देखें और मापें कि उसे समझने में कितना समय लगता है।

मैं एक शुरुआत कर रहा हूँ जब यह regex की बात आती है, लेकिन आईएमएचओ यह मूल regex सीखने में कुछ समय बिताने के लिए उपयुक्त है, आपको लगता है कि बहुत से, कई समस्याएं हैं जिन्हें आप हल कर चुके हैं (और हो सकता है) regex का उपयोग करके हल किया जा सकता है।

किसी विशेष समस्या के लिए, regexlib जैसे किसी साइट पर एक समाधान खोजने का प्रयास करें, और देखें कि क्या आप समाधान समझ सकते हैं।

जैसा कि ऊपर बताया गया है, regex एक विशेष समस्या को हल करने के लिए पर्याप्त नहीं है, लेकिन regexlib जैसे एक साइट ब्राउज़िंग ब्राउज़िंग निश्चित रूप से आपको बताएगा कि क्या regex आपकी समस्या का सही समाधान है।

आप हमेशा नियमित अभिव्यक्ति सीखना चाहिए – केवल इस तरह से आप उनका उपयोग करने के लिए निर्णय ले सकते हैं। आम तौर पर उन्हें समस्याग्रस्त मिलता है, जब आपको बहुत अच्छा प्रदर्शन की आवश्यकता होती है। लेकिन एक बड़ा स्विच स्टेटमेंट लिखने की तुलना में अक्सर एक बहुत अधिक आसान है regex का उपयोग करना

इस प्रश्न पर एक नज़र डालें – जो आपको इसी तरह के विपरीत रेगेक्स की सुंदरता दिखाता है (यदि निर्माण) …

टेक्स्ट में (नियमित) पैटर्न पहचानने के लिए नियमित अभिव्यक्ति का उपयोग करें डेटा संरचनाओं में पाठ को पार्स करने के लिए इसका उपयोग न करें। अभिव्यक्ति बहुत बड़े होने पर नियमित अभिव्यक्ति का उपयोग न करें।

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

बहुत कम से कम, मैं कह सकता हूँ नियमित अभिव्यक्ति सीखो ताकि आप उन्हें पूरी तरह से समझें और परिस्थितियों में उन्हें लागू कर सकें जहां वे काम करेंगे। मेरे सिर के ऊपर से मैं रेगुलर एक्सप्रेशन का प्रयोग कर रहा हूं:

  • स्ट्रिंग के भागों की पहचान करना
  • जांचना कि क्या कोई स्ट्रिंग किसी निश्चित प्रारूप या निर्माण के अनुरूप है।
  • एक निश्चित पैटर्न से मेल खाने वाली सबस्ट्रिंग ढूंढना
  • ट्रांसफ़ॉर्मिंग स्ट्रिंग्स जो कि एक निश्चित प्रपत्र को एक अलग रूप में फिट करते हैं (खोज-प्रतिस्थापन, कैपिटलाइज़ेशन आदि)।

सैद्धांतिक स्तर पर नियमित अभिव्यक्ति, कंप्यूटर विज्ञान में एक राज्य मशीन की नींव होती है – आपके पास डिटमिनेस्टिक कंटिटा ऑटोमाटाटा (डीएफए) और नॉन-डिटरमिनिस्टिक परिमित ऑटोमेटा (एनएफए) है। आप निविष्टियों पर किसी प्रकार की मान्यता को लागू करने के लिए नियमित अभिव्यक्ति का उपयोग कर सकते हैं – नियमित अभिव्यक्ति इंजन केवल वास्तविक अभिव्यक्ति पैटर्न / स्ट्रिंग को वास्तविक रनटाइम ऑपरेशंस में कन्वर्ट या कनवर्ट करते हैं।

एक बार जब आप जानते हैं कि क्या स्ट्रिंग (या डेटा) आप वैध होने का निर्धारण करना चाहते हैं, तो डीएफए द्वारा परीक्षण किया जा सकता है, आप को यह विकल्प चुनना होगा कि क्या डीएफए खुद को अपना कोड या नियमित अभिव्यक्ति इंजन का इस्तेमाल कर रहा है। आप पाएंगे कि नियमित अभिव्यक्ति के बारे में जानने से वास्तव में आपके टूलबॉक्स में वृद्धि होगी और आपकी समझ में कैसे स्ट्रिंग प्रोसेसिंग वास्तव में जटिल हो सकती है

साधारण नियमित अभिव्यक्ति के आधार पर आप पार्सर्स के बारे में सीख सकते हैं और पार्सर्स कैसे काम करते हैं निम्नतम स्तर पर आप वाकई विश्लेषण (जहां नियमित अभिव्यक्ति काम करते हैं) देख रहे हैं और उच्च स्तर पर एक व्याकरण और अर्थ क्रिया ये आधार हैं जिस पर कंपलर और दुभाषियों का काम होता है, साथ ही प्रोटोकॉल पार्सर कार्यान्वयन, और दस्तावेज़ रेंडरिंग / ट्रांसफ़ॉर्मेशन एप्लिकेशन पर भरोसा करते हैं।

मुख्य चिंता का विषय यहाँ रखरखाव है।

यह मेरे लिए स्पष्ट है, कि किसी भी प्रोग्रामर को अपने नमक के लिए रेगुलर एक्सप्रेशन का पता होना चाहिए । उन्हें नहीं जानना, यह कहने की तरह है, नहीं जानते कि क्या अमूर्त और इनकैप्सुलेशन है, केवल, शायद, इससे भी बदतर। तो यह प्रश्न से बाहर है।

दूसरी ओर, किसी को भी विचार करना चाहिए, कि किसी भी भाषा में लिखी जाने वाली रैगेक्स-संचालित कोड को बनाए रखना भी उन लोगों के लिए एक दुःस्वप्न भी हो सकता है जो वास्तव में अच्छा है। इसलिए, मेरी राय में, यहां सही दृष्टिकोण केवल उनको उपयोग करने के लिए है, जब यह अनिवार्य है और जब कोड regex का इस्तेमाल करता है तो इसके गैर-रेगेक्स संस्करण की तुलना में अधिक पठनीय होगा। और जाहिर है, जैसा कि पहले से ही संकेत दिया गया है, उन्हें किसी चीज़ के लिए उपयोग न करें, कि वे ऐसा करने के लिए नहीं हैं (जैसे एक्सएमएल)। और कोई भी ईमेल पता सत्यापन नहीं है (मेरे पालतू जानवरों में से एक: पी)!

लेकिन गंभीरता से, जब आप उन सभी उपस्ट्रेट्स का उपयोग कुछ के लिए करते हैं, तो यह गलत नहीं लगता है, जो कि कुछ हद तक वर्णों के साथ हल किया जा सकता है, लाइन शोर की तरह लग रहा है? मुझे पता है कि यह मेरे लिए किया था