नियमित अभिव्यक्ति टिप्पणी करना


11

क्या नियमित अभिव्यक्तियों पर टिप्पणी करने के लिए कोई सामान्य प्रथाएं हैं: सभी अभिव्यक्ति के लिए RegEx या सामान्य टिप्पणी के विभिन्न भाग का उल्लेख करते हुए इनलाइन टिप्पणियां?


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

6
नियमित अभिव्यक्ति के लिए अंगूठे का मेरा नियम है: यदि आपको नियमित अभिव्यक्ति पर टिप्पणी करने की आवश्यकता है, तो यह बहुत जटिल है।
zzzzBov

1
और हमेशा इस लिंक को शामिल करें: regexcrossword.com
Kieveli

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

जवाबों:


10

मेरे विचार में, एक अच्छा अभ्यास यह है कि टिप्पणियों में सामान्य रूप से बताया जाए कि नियमित अभिव्यक्ति का सामान्य विचार क्या है। यह अन्य डेवलपर्स (या कभी-कभी खुद को बचाता है) RegExr जैसे parser में regex को कॉपी-पेस्ट करने की परेशानी को केवल यह समझने के लिए कि यह क्या करता है।


2
RegExr वैसे भी होगा, जब तक कि देव एक रेगेक्स सेवेंट नहीं है। लेकिन मैं एक सामान्य विवरण प्रदान करने से सहमत हूं; यही मैं अपने रेगेक्स के साथ करता हूं।
रॉबर्ट हार्वे

3
+1: कुछ भी अधिक विस्तृत एक टिप्पणी के रूप में regex में एक क्रैश कोर्स हो जाएगा।
मैट

यह जवाब और @zzzzBov टिप्पणियों से समझ में आता है।
m0nhawk

1
यह न केवल इसे समझने के लिए नियमित अभिव्यक्ति की थकाऊ परीक्षा की परेशानी को बचाता है, बल्कि यह मूल प्रोग्रामर की मंशा को स्पष्ट करता है, विशेष रूप से इस बात की विशेष संभावना को देखते हुए कि मूल प्रोग्रामर को नियमित अभिव्यक्ति ही गलत समय के दौर में मिली। यह कहने के बाद कि, रेगेक्स को एक अच्छा चर नाम देने के कई मामलों में, इरादे के पर्याप्त दस्तावेज प्रदान करने की दिशा में लंबा रास्ता तय किया जा सकता है।
क्रेग

9

यह कुछ हद तक एक भाषा विशिष्ट उत्तर है, लेकिन प्रश्न में कोई भाषा नहीं बताई गई है।

पुस्तक "डाइव इनटू पायथन" वर्बोज़ रेगुलर एक्सप्रेशंस का उपयोग करते हुए टिप्पणियों को लागू करने का सुझाव देती है :

पायथन आपको क्रिया नियमित अभिव्यक्ति नामक कुछ के साथ ऐसा करने की अनुमति देता है। एक क्रिया नियमित अभिव्यक्ति दो तरीकों से एक कॉम्पैक्ट नियमित अभिव्यक्ति से अलग है:

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

उदाहरण:

>>> pattern = """
^                   # beginning of string
M{0,4}              # thousands - 0 to 4 M's
(CM|CD|D?C{0,3})    # hundreds - 900 (CM), 400 (CD), 0-300 (0 to 3 C's),
                    #            or 500-800 (D, followed by 0 to 3 C's)
(XC|XL|L?X{0,3})    # tens - 90 (XC), 40 (XL), 0-30 (0 to 3 X's),
                    #        or 50-80 (L, followed by 0 to 3 X's)
(IX|IV|V?I{0,3})    # ones - 9 (IX), 4 (IV), 0-3 (0 to 3 I's),
                    #        or 5-8 (V, followed by 0 to 3 I's)
$                   # end of string
"""
>>> re.search(pattern, 'M', re.VERBOSE)                1

स्रोत और आगे का विवरण यहाँ

इस पद्धति का एक मामूली नुकसान है कि फोन करने वाले को यह पता होना चाहिए कि पैटर्न एक क्रिया प्रारूप में लिखा गया है और तदनुसार कॉल करें।


2
एक चर में पैटर्न को संग्रहीत करने के बजाय, आप re.compileउस बिंदु पर उपयोग कर सकते हैं जहां आप अपने पैटर्न को परिभाषित करते हैं, और केवल परिणामी वस्तु को संग्रहीत करते हैं। इस तरह, पैटर्न संकलन झंडे (सहित re.VERBOSE) को पैटर्न से अलग होने की आवश्यकता नहीं है।
जॉन बार्थोलोम्यू

वास्तव में उपयोगी उत्तर, धन्यवाद! लेकिन #अगर मैं क्रिया ध्वज का उपयोग कर रहा हूं तो मैं कैसे मेल कर सकता हूं ? वैसे: स्रोत लिंक नीचे लग रहे हैं।
विंकलेरर

ठीक है, तो #सचमुच मिलान किया जा सकता है जब एक चरित्र वर्ग के अंदर: [#]: (स्रोत docs.python.org/3/library/re.html#re.X )
winklerrr

8

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

// Strip the leading "?" and remove the query parameters "offset=<integer>" & "count=<integer> so we have a pattern of the request"          
var search = location.search.substring(1).replace(/offset=[0-9]+?&/g, "").replace(/count=[0-9]+?&/g, "");

जब तक आप कोड में टिप्पणियों के माध्यम से रेगेक्स के बारे में किसी को सिखाने की कोशिश नहीं कर रहे हैं, मुझे नहीं लगता कि प्रत्येक व्यक्तिगत टुकड़ा क्या कर रहा है। जब अन्य प्रोग्रामर के साथ काम करते हैं, तो आप सुरक्षित रूप से मान सकते हैं कि किसी को वैश्विक नियमित अभिव्यक्ति के रूप में कुछ पता होगा।


3
आपको आश्चर्य होगा ...
मैट

6

मुझे लगता है कि यह वास्तव में इस बात पर निर्भर करता है कि आप रेगेक्स को एक साथ कैसे रख रहे हैं। आम तौर पर बोलते हुए मुझे लगता है कि वास्तविक रेगेक्स स्ट्रिंग के भीतर ही टिप्पणियां डालना एक बुरा विचार होगा (जहां तक ​​मुझे पता है, ज्यादातर स्थितियों में संभव नहीं है)। यदि आपको वास्तव में एक नियमित अभिव्यक्ति के विशिष्ट भागों पर टिप्पणी करने की आवश्यकता है (क्या आप किसी को पढ़ाने की कोशिश कर रहे हैं?), तो प्रत्येक लाइन को अपनी स्वयं की लाइनों पर अलग-अलग तारों में तोड़ दें, और अपनी प्रोग्रामिंग भाषा के लिए सामान्य टिप्पणी प्रक्रिया का उपयोग करके प्रत्येक पंक्ति पर टिप्पणी करें। अन्यथा, pleinolijf का उत्तर बहुत अच्छा है।

उदाहरण:

string myregex = "\s" // Match any whitespace once
+ "\n"  // Match one newline character
+ "[a-zA-Z]";  // Match any letter

4

मैं आमतौर पर एक स्ट्रिंग स्थिरांक को परिभाषित करता हूं जिसका नाम नियमित अभिव्यक्ति के समग्र उद्देश्य का वर्णन करता है।

उदाहरण के लिए:

const string FloatingPointNumberPattern = @"[-+]?[0-9]*\.?[0-9]+";

आप इसे विवरण देने के लिए इस स्थिरांक के ऊपर एक टिप्पणी जोड़ सकते हैं, लेकिन आमतौर पर निरंतर नाम ही पर्याप्त होना चाहिए।


1
एक अतिरिक्त बात जो मुझे इस उत्तर के बारे में पसंद है, वह यह है कि यदि इसका उपयोग एक से अधिक स्थानों पर किया जाता है, तो इरादे को भी इधर-उधर ले जाना पड़ता है - कोई टिप्पणी करना नहीं भूलता।
जे ट्राना

3

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

इन जैसे मामलों में, यह विविधताओं के उदाहरणों को दस्तावेज करने के लिए सार्थक हो सकता है। इस दस्तावेज़ का स्थान राशि के आधार पर भिन्न हो सकता है (उदाहरण के लिए, कोड में आवश्यक नहीं)।

यह दृष्टिकोण करने का एक तरीका यह है कि भविष्य के डेवलपर्स को केवल बुनियादी ज्ञान होगा, जैसे कि नियमित अभिव्यक्ति कैसे काम करती है, लेकिन ऐसा कोई ज्ञान नहीं है जो आपके पास या तो (1) नियमित अभिव्यक्ति के विकास से पहले था जो जरूरी नहीं कि दृष्टिकोण के लिए जाना जाएगा। भविष्य के डेवलपर्स या (2) ज्ञान जो आपने विकास के दौरान प्राप्त किया (उदाहरण के लिए, किनारे के मामले जो खोजे गए थे)।

उदाहरण के लिए, अगर विकास के दौरान आप कुछ ऐसा कहते हैं जैसे "ओह, मुझे नहीं पता था कि एक्स इस फॉर्म को ले सकता है," तो यह दस्तावेज के लायक है (और शायद रेगेक्स का हिस्सा जो उस भिन्नता को संभालता है)।


2

टिप्पणियों में उपयोगी जानकारी को जोड़ना चाहिए जो कोड से स्पष्ट नहीं है।

  1. यह समझना आसान बनाइए कि अभिव्यक्ति को आवश्यकताओं के स्तर पर क्या करना चाहिए, या तो कोड में या टिप्पणी में। अभिव्यक्ति के पीछे क्या मंशा है, क्या यह ईमेल पते को मान्य करने या कनाडाई फोन नंबर लेने के लिए है।
  2. यह समझना आसान बनाएं कि अभिव्यक्ति वास्तव में क्या कर रही है, अर्थात अभिव्यक्ति का मूल्यांकन क्या है। पहले अभिव्यक्ति को विभाजित करके इसे स्पष्ट करने का प्रयास करें, यदि आप पहले सभी हाइफ़न की जांच करते हैं, तो सभी संख्याओं को हटा दें, फिर यह बनाएं कि मध्यस्थ मूल्यों को रखने वाले चर के साथ दो भाग की अभिव्यक्ति, यह पढ़ने में बहुत आसान बना देगा और पाठक होगा अपने तर्क के माध्यम से एक बार में एक कदम रखने में सक्षम। (एसई पर एक प्रश्न का एक प्रसिद्ध उत्तर है जहां कोई व्यक्ति कुछ पुराने कोड को समझने की कोशिश कर रहा है जिसमें बिट हेरफेर शामिल है '>>' और यह पता लगाना कि क्या कुछ झंडे सेट किए गए हैं जहां उत्तर न केवल यह बताता है कि कोड वास्तव में क्या करता है बल्कि कैसे प्रश्न के विवरण को भविष्य में इस तरह के कोड को डिकॉन्स्ट्रक्ट करने के बारे में जाना चाहिए जो वास्तव में मैं वर्णन करने की कोशिश कर रहा हूं लेकिन मैं कर सकता हूं '

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

और याद रखें कि अगला व्यक्ति आपके कोड में आएगा और एक बग को ठीक कर सकता है जो छह महीने के समय में हो सकता है और ऐसा कोई तरीका नहीं है जिसे आप याद रखें कि यह क्या करना चाहिए था।


1

RegEx को एक अलग वर्ग में एक सार्थक नाम के साथ निकालें। फिर मैं स्वचालित परीक्षणों के साथ कोड का दस्तावेजीकरण करूंगा।

यह सुनिश्चित करेगा

  • यह कोड वास्तव में काम करता है - कोने के मामलों के लिए भी
  • यह सुनिश्चित करता है कि एक त्वरित "बगफिक्स" बहुत सारे कोने के मामलों को पेंच नहीं करता है
  • मई दस्तावेज़ अनुकूलन जहां बैकट्रैकिंग अक्षम है

स्वाभाविक रूप से, आपकी कक्षा कई रेगेक्स की मेजबानी कर सकती है।

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