क्या नियमित अभिव्यक्तियों पर टिप्पणी करने के लिए कोई सामान्य प्रथाएं हैं: सभी अभिव्यक्ति के लिए RegEx या सामान्य टिप्पणी के विभिन्न भाग का उल्लेख करते हुए इनलाइन टिप्पणियां?
क्या नियमित अभिव्यक्तियों पर टिप्पणी करने के लिए कोई सामान्य प्रथाएं हैं: सभी अभिव्यक्ति के लिए RegEx या सामान्य टिप्पणी के विभिन्न भाग का उल्लेख करते हुए इनलाइन टिप्पणियां?
जवाबों:
मेरे विचार में, एक अच्छा अभ्यास यह है कि टिप्पणियों में सामान्य रूप से बताया जाए कि नियमित अभिव्यक्ति का सामान्य विचार क्या है। यह अन्य डेवलपर्स (या कभी-कभी खुद को बचाता है) RegExr जैसे parser में regex को कॉपी-पेस्ट करने की परेशानी को केवल यह समझने के लिए कि यह क्या करता है।
यह कुछ हद तक एक भाषा विशिष्ट उत्तर है, लेकिन प्रश्न में कोई भाषा नहीं बताई गई है।
पुस्तक "डाइव इनटू पायथन" वर्बोज़ रेगुलर एक्सप्रेशंस का उपयोग करते हुए टिप्पणियों को लागू करने का सुझाव देती है :
पायथन आपको क्रिया नियमित अभिव्यक्ति नामक कुछ के साथ ऐसा करने की अनुमति देता है। एक क्रिया नियमित अभिव्यक्ति दो तरीकों से एक कॉम्पैक्ट नियमित अभिव्यक्ति से अलग है:
- व्हाट्सएप को नजरअंदाज किया जाता है। रिक्त स्थान, टैब और गाड़ी के रिटर्न के रूप में रिक्त स्थान, टैब और गाड़ी के रिटर्न का मिलान नहीं किया जाता है। वे बिल्कुल मेल नहीं खाते। (यदि आप एक क्रिया नियमित अभिव्यक्ति में एक स्थान से मेल खाना चाहते हैं, तो आपको इसके सामने एक बैकस्लैश डालकर बचना होगा।)
- टिप्पणियों को नजरअंदाज किया जाता है। क्रिया नियमित अभिव्यक्ति में एक टिप्पणी सिर्फ पायथन कोड में एक टिप्पणी की तरह है: यह एक
#
चरित्र से शुरू होता है और पंक्ति के अंत तक जाता है। इस मामले में यह आपके स्रोत कोड के भीतर एक मल्टी-लाइन स्ट्रिंग के भीतर एक टिप्पणी है, लेकिन यह उसी तरह से काम करता है।
उदाहरण:
>>> 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
स्रोत और आगे का विवरण यहाँ
इस पद्धति का एक मामूली नुकसान है कि फोन करने वाले को यह पता होना चाहिए कि पैटर्न एक क्रिया प्रारूप में लिखा गया है और तदनुसार कॉल करें।
re.compile
उस बिंदु पर उपयोग कर सकते हैं जहां आप अपने पैटर्न को परिभाषित करते हैं, और केवल परिणामी वस्तु को संग्रहीत करते हैं। इस तरह, पैटर्न संकलन झंडे (सहित re.VERBOSE
) को पैटर्न से अलग होने की आवश्यकता नहीं है।
#
अगर मैं क्रिया ध्वज का उपयोग कर रहा हूं तो मैं कैसे मेल कर सकता हूं ? वैसे: स्रोत लिंक नीचे लग रहे हैं।
#
सचमुच मिलान किया जा सकता है जब एक चरित्र वर्ग के अंदर: [#]
: (स्रोत docs.python.org/3/library/re.html#re.X )
आमतौर पर, मैं एक रेगेक्स लिखूंगा और रेगेक्स के अलग-अलग टुकड़ों की व्याख्या नहीं करूंगा, बल्कि इसका उद्देश्य क्या है। वह यह कि क्या और क्यों। यह पूछने में थोड़ा सा है कि "मेरी टिप्पणियों को क्या देखना चाहिए?" जिस पर कोई यह कहेगा कि " कोड क्या कर रहा है, उसे मत लिखो, कोड ऐसा क्यों कर रहा है "
// 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, "");
जब तक आप कोड में टिप्पणियों के माध्यम से रेगेक्स के बारे में किसी को सिखाने की कोशिश नहीं कर रहे हैं, मुझे नहीं लगता कि प्रत्येक व्यक्तिगत टुकड़ा क्या कर रहा है। जब अन्य प्रोग्रामर के साथ काम करते हैं, तो आप सुरक्षित रूप से मान सकते हैं कि किसी को वैश्विक नियमित अभिव्यक्ति के रूप में कुछ पता होगा।
मुझे लगता है कि यह वास्तव में इस बात पर निर्भर करता है कि आप रेगेक्स को एक साथ कैसे रख रहे हैं। आम तौर पर बोलते हुए मुझे लगता है कि वास्तविक रेगेक्स स्ट्रिंग के भीतर ही टिप्पणियां डालना एक बुरा विचार होगा (जहां तक मुझे पता है, ज्यादातर स्थितियों में संभव नहीं है)। यदि आपको वास्तव में एक नियमित अभिव्यक्ति के विशिष्ट भागों पर टिप्पणी करने की आवश्यकता है (क्या आप किसी को पढ़ाने की कोशिश कर रहे हैं?), तो प्रत्येक लाइन को अपनी स्वयं की लाइनों पर अलग-अलग तारों में तोड़ दें, और अपनी प्रोग्रामिंग भाषा के लिए सामान्य टिप्पणी प्रक्रिया का उपयोग करके प्रत्येक पंक्ति पर टिप्पणी करें। अन्यथा, pleinolijf का उत्तर बहुत अच्छा है।
उदाहरण:
string myregex = "\s" // Match any whitespace once
+ "\n" // Match one newline character
+ "[a-zA-Z]"; // Match any letter
मैं आमतौर पर एक स्ट्रिंग स्थिरांक को परिभाषित करता हूं जिसका नाम नियमित अभिव्यक्ति के समग्र उद्देश्य का वर्णन करता है।
उदाहरण के लिए:
const string FloatingPointNumberPattern = @"[-+]?[0-9]*\.?[0-9]+";
आप इसे विवरण देने के लिए इस स्थिरांक के ऊपर एक टिप्पणी जोड़ सकते हैं, लेकिन आमतौर पर निरंतर नाम ही पर्याप्त होना चाहिए।
कुछ परिदृश्यों में, डेवलपर अपने ठेठ डोमेन के बाहर पाठ से मेल खाने के लिए नियमित अभिव्यक्ति का उपयोग कर सकता है। मूल डेवलपर्स बहुत सारे पुनरावृत्तियों से गुजरे हैं जो विभिन्न किनारे के मामलों को कैप्चर कर रहे हैं जो केवल उस पुनरावृत्ति प्रक्रिया के माध्यम से खोजे जा सकते हैं। इस प्रकार, बाद के डेवलपर्स को बहुत सारे किनारे के मामलों के बारे में पता नहीं हो सकता है, जो मूल डेवलपर (एस) के साथ निपटा जाता है, भले ही वे सामान्य मामले से अवगत हों।
इन जैसे मामलों में, यह विविधताओं के उदाहरणों को दस्तावेज करने के लिए सार्थक हो सकता है। इस दस्तावेज़ का स्थान राशि के आधार पर भिन्न हो सकता है (उदाहरण के लिए, कोड में आवश्यक नहीं)।
यह दृष्टिकोण करने का एक तरीका यह है कि भविष्य के डेवलपर्स को केवल बुनियादी ज्ञान होगा, जैसे कि नियमित अभिव्यक्ति कैसे काम करती है, लेकिन ऐसा कोई ज्ञान नहीं है जो आपके पास या तो (1) नियमित अभिव्यक्ति के विकास से पहले था जो जरूरी नहीं कि दृष्टिकोण के लिए जाना जाएगा। भविष्य के डेवलपर्स या (2) ज्ञान जो आपने विकास के दौरान प्राप्त किया (उदाहरण के लिए, किनारे के मामले जो खोजे गए थे)।
उदाहरण के लिए, अगर विकास के दौरान आप कुछ ऐसा कहते हैं जैसे "ओह, मुझे नहीं पता था कि एक्स इस फॉर्म को ले सकता है," तो यह दस्तावेज के लायक है (और शायद रेगेक्स का हिस्सा जो उस भिन्नता को संभालता है)।
टिप्पणियों में उपयोगी जानकारी को जोड़ना चाहिए जो कोड से स्पष्ट नहीं है।
हर अंतिम चक्र के लिए कुछ एप्लिकेशन की आवश्यकता होती है, यदि आप बड़े पैमाने पर डेटा सेट से मेल खाते पैटर्न हैं तो शायद एक बेहतर तरीका है, शायद नहीं, लेकिन ज्यादातर चीजों के लिए अतिरिक्त निष्पादन समय उतना बड़ा सौदा नहीं है।
और याद रखें कि अगला व्यक्ति आपके कोड में आएगा और एक बग को ठीक कर सकता है जो छह महीने के समय में हो सकता है और ऐसा कोई तरीका नहीं है जिसे आप याद रखें कि यह क्या करना चाहिए था।
RegEx को एक अलग वर्ग में एक सार्थक नाम के साथ निकालें। फिर मैं स्वचालित परीक्षणों के साथ कोड का दस्तावेजीकरण करूंगा।
यह सुनिश्चित करेगा
स्वाभाविक रूप से, आपकी कक्षा कई रेगेक्स की मेजबानी कर सकती है।