बहुतेक प्रोग्रामरमध्ये एक मोठी त्रुटी असते. ते आनंदाने एखादी डिस्ट्रिब्युटेड सिस्टम (distributed system) डीबग करतील किंवा नवीन फ्रेमवर्कशी झुंज देतील, तरीही ते असा मॅन्युअल मजकूर संपादन करण्यासाठी वीस मिनिटे खर्च करतील ज्यासाठी फक्त दहा सेकंद लागायला हवे होते. याचे कारण नेहमी एकच असते: रेग्युलर एक्सप्रेशन्स (regex) हे एखाद्या गोंधळलेल्या ओळींसारखे (line noise) दिसतात. एक सामान्य पॅटर्न म्हणजे स्लॅश, बॅकस्लॅश आणि विरामचिन्हांचा असा डोंगर जो एखाद्या १९९० च्या दशकातील मोडेममधून पाठवल्यासारखा वाटतो. हा दृश्य गोंधळ सक्षम लोकांना एका खऱ्या मौल्यवान कौशल्यापासून दूर पळवतो.
चांगली बातमी ही आहे की regex कठीण नाही. ते फक्त संक्षिप्त (dense) आहे. चिन्हे एका लहान जागेत प्रचंड अर्थ साठवून ठेवतात, त्यामुळे जिथे प्रत्यक्षात एक अतिशय अचूक वर्णन असते, तिथे तुमचे डोळे केवळ यादृच्छिकता (randomness) वाचतात. एकदा का तुमच्याकडे योग्य मानसिक मॉडेल (mental model) तयार झाले की, तुम्ही चिन्हांचा एक-एक करून अर्थ लावण्याचा प्रयत्न करणे थांबवता आणि त्याऐवजी ते कोणत्या आकाराचे वर्णन करत आहेत ते वाचू लागता. जेव्हा तुम्ही असे करता, तेव्हा तो गोंधळ पूर्णपणे नाहीसा होतो.
एक पॅटर्न, प्रोग्राम नाही
मूलभूत बदल म्हणजे रेग्युलर एक्सप्रेशन्स प्रत्यक्षात काय आहेत हे समजून घेणे. तुम्ही लिहिलेला बहुतेक कोड 'प्रोसीजरल' (procedural) असतो: हे करा, मग ते करा, ही अट तपासा, पुन्हा लूप करा. regex ही कोणतीही प्रक्रिया (procedure) नाही. तो एक स्थिर पॅटर्न (static pattern) आहे जो मजकूर कसा दिसला पाहिजे याचे वर्णन करतो. तुम्ही शोधण्यासाठी सूचना लिहित नाही आहात; तुम्ही मॅचिंग इंजिनला (matching engine) एक रेखाचित्र देत आहात आणि त्याला काम करू देत आहात.
याला साध्या भाषेत आकार वर्णन करण्यासारखे समजा:
- पाच अंकी संख्या.
- ईमेल पत्ता.
- मोठ्या अक्षराने सुरू होणारी ओळ.
regex फक्त इतकेच करत असतो, फक्त तो एका संक्षिप्त वर्णमालेचा वापर करतो. जेव्हा तुम्ही \d{5} पाहता, तेव्हा तुम्ही जादू पाहत नसता. तुम्ही "एक अंक, पाच वेळा" असे पाहत असता. जेव्हा तुम्ही ^[A-Z] पाहता, तेव्हा तुम्ही "ओळीची सुरुवात, त्यानंतर एक मोठे अक्षर" असे पाहत असता. हे कौशल्य पाठांतर करणे नाही. तर पॅटर्नकडे एक दृष्टीने पाहणे आणि त्याचे पुन्हा साध्या भाषेत रूपांतर करणे शिकणे आहे. एकदा का तुम्ही हे रूपांतर करू शकलात की, भीती निघून जाते.
वेळ प्रत्यक्षात कुठे खर्च होतो
लोक सहसा तेव्हाच regex शिकतात जेव्हा त्यांना पुरेसा त्रास सहन करावा लागतो. त्याऐवजी, एखादे काम करण्यासाठी वेळ वाया घालवण्यापूर्वीच, अशा कामांची ओळख करून घेणे चांगले आहे ज्यासाठी पॅटर्नची गरज आहे.
जर तुम्हाला दोनशे पानांच्या दस्तऐवजात प्रत्येक तारीख शोधायची असेल, तर regex एकाच वेळी त्या शोधून काढेल. जर तुम्हाला तुमचा ॲप्लिकेशन स्वीकारण्यापूर्वी वापरकर्त्याने खरोखर URL टाईप केली आहे की नाही याची पडताळणी (validate) करायची असेल, तर एक पॅटर्न पत्त्याचा मूलभूत आकार लागू करू शकतो. जर तुम्ही वेबसाइटवरून कॉपी केलेला मजकूर स्वच्छ करत असाल आणि अनेक स्पेस एकत्र करून एकच स्पेस करायची असेल, तर रिप्लेसमेंट regex फक्त चार अक्षरांचा लागतो. जर तुम्ही विस्कळीत सर्व्हर लॉगमधून डेटा काढत असाल, तर असंरचित मजकूर (unstructured text) आणि रचनात्मक अहवाल (structured report) यांच्यातील regex हा अनेकदा एकमेव व्यवहार्य दुवा असतो.
एक साधा नियम लक्षात ठेवा: जर तुम्ही एखादे मजकूर संपादन (text edit) हाताने पन्नास वेळा करणार असाल, तर थांबा. त्याऐवजी एक पॅटर्न लिहा. मॅन्युअल पुनरावृत्ती केवळ संथ नसते; ती अविश्वसनीय देखील असते. तुम्ही ४७ वे उदाहरण चुकवू शकता किंवा ३३ व्या वेळी टायपिंगची चूक करू शकता. पॅटर्न एकदाच आणि अचूकपणे काम करतो, आणि तुम्ही सुरुवातीला जो नियम लागू करत होता त्याचे तो दस्तऐवजीकरण देखील करतो.
एक प्रभावी लर्निंग लूप
स्मरणातून (memory) परिपूर्ण पॅटर्न टाईप करण्याचा प्रयत्न करू नका. यामुळेच नैराश्य वाढते. त्याऐवजी, सिंटॅक्समध्ये (syntax) अडकून न पडता तुम्हाला पुढे नेणारा एक छोटा लूप फॉलो करा.
- आकार शब्दांत वर्णन करा. एखादे विशेष अक्षर (special character) वापरण्यापूर्वी, तुम्हाला नक्की काय हवे आहे ते लिहून काढा. "चार अंक, त्यानंतर एक डॅश, त्यानंतर दोन अंक, त्यानंतर एक डॅश, त्यानंतर दोन अंक." जर तुम्ही ते स्पष्टपणे सांगू शकत नसाल, तर तुम्ही त्याचा पॅटर्न बनवू शकत नाही.
- पहिला मसुदा तयार करा. तुमच्या वर्णनाचे रूपांतर शक्य तितक्या व्यापक चिन्हांचा वापर करून एका मूलभूत पॅटर्नमध्ये करा. परिपूर्णतेबद्दल काळजी करू नका. तुम्ही एक प्रोटोटाइप (prototype) तयार करत आहात,
