अपने रेगेक्स जायके को जानें
ऐसे लोगों की एक आश्चर्यजनक मात्रा है जो सोचते हैं कि नियमित रूप से अभिव्यक्ति अनिवार्य रूप से भाषा अज्ञेय है। हालांकि, स्वाद के बीच वास्तव में काफी अंतर हैं, और विशेष रूप से कोड गोल्फ के लिए उनमें से कुछ को जानना अच्छा है, और उनकी दिलचस्प विशेषताएं हैं, इसलिए आप प्रत्येक कार्य के लिए सबसे अच्छा चुन सकते हैं। यहाँ कई महत्वपूर्ण स्वादों का अवलोकन है और जो उन्हें दूसरों से अलग करता है। (यह सूची वास्तव में पूरी नहीं हो सकती है, लेकिन मुझे बताएं कि क्या मैं वास्तव में कुछ याद कर रहा हूं।)
पर्ल और पीसीआरई
मैं इन्हें एक ही बर्तन में फेंक रहा हूं, क्योंकि मैं पर्ल स्वाद से बहुत परिचित नहीं हूं और वे ज्यादातर बराबर हैं (पीसीआरई सभी के बाद पर्ल-कम्पेटिबल रेगुलर एक्सप्रेशंस के लिए है)। पर्ल स्वाद का मुख्य लाभ यह है कि आप वास्तव में रेगेक्स और प्रतिस्थापन के अंदर से पर्ल कोड को कॉल कर सकते हैं।
- रिकर्सन / सबरूटीन्स । संभवतः गोल्फ के लिए सबसे महत्वपूर्ण विशेषता (जो केवल कुछ स्वादों में मौजूद है)।
- सशर्त पैटर्न
(?(group)yes|no)
।
- समर्थन के साथ प्रतिस्थापन स्ट्रिंग में मामले की बदल
\l
, \u
, \L
और \U
।
- पीसीआरई लुकबाइंड्स में विकल्प की अनुमति देता है, जहां प्रत्येक विकल्प में एक अलग (लेकिन निश्चित) लंबाई हो सकती है। (अधिकांश स्वादों में, पर्ल सहित लुकहाइंड्स की कुल निश्चित लंबाई होनी चाहिए।)
\G
पिछले मैच के अंत के लिए एक मैच लंगर करने के लिए।
\K
मैच की शुरुआत को रीसेट करने के लिए
- PCRE यूनिकोड के चरित्र गुणों और लिपियों दोनों का समर्थन करता है ।
\Q...\E
पात्रों के लंबे रन से बचने के लिए। उपयोगी जब आप एक स्ट्रिंग से मेल खाने की कोशिश कर रहे हैं जिसमें कई मेटा-वर्ण हैं।
नेट
यह शायद सबसे शक्तिशाली स्वाद है, जिसमें बहुत कम कमियां हैं।
गोल्फिंग के संदर्भ में एक महत्वपूर्ण कमी यह है कि यह कुछ अन्य स्वादों की तरह प्रभावशाली मात्राओं का समर्थन नहीं करता है। इसके बजाय .?+
आपको लिखना होगा (?>.?)
।
जावा
- एक बग के कारण (परिशिष्ट देखें) जावा सीमित प्रकार के चर-लंबाई वाले लुकबाइंड का समर्थन करता है: आप स्ट्रिंग की शुरुआत के लिए सभी तरह
.*
से देख सकते हैं जहां से आप अब एक लुकहेड शुरू कर सकते हैं, जैसे (?<=(?=lookahead).*)
।
- वर्ण वर्गों के मिलन और अंतरंग का समर्थन करता है।
- यूनिकोड के लिए सबसे व्यापक समर्थन है, "यूनिकोड लिपियों, ब्लॉकों, श्रेणियों और बाइनरी गुणों" के लिए चरित्र वर्गों के साथ ।
\Q...\E
के रूप में पर्ल / पीसीआरई में।
माणिक
हाल के संस्करणों में, यह स्वाद पीसीआरई के समान शक्तिशाली है, जिसमें सबरूटीन कॉल के लिए समर्थन भी शामिल है। जावा की तरह, यह चरित्र वर्गों के संघ और चौराहे का भी समर्थन करता है। एक विशेष विशेषता हेक्स अंकों के लिए अंतर्निहित चरित्र वर्ग है: \h
(और नकारात्मक \H
)।
गोल्फ के लिए सबसे उपयोगी सुविधा हालांकि रूबी क्वांटिफायर को कैसे संभालती है। सबसे विशेष रूप से, यह कोष्ठक के बिना क्वांटिफायर घोंसले के लिए संभव है। .{5,7}+
काम करता है और ऐसा ही करता है .{3}?
। साथ ही, अधिकांश अन्य स्वादों के विपरीत, यदि एक क्वांटिफायर पर निचली बाउंड को 0
छोड़ा जा सकता है, तो .{,5}
इसके बराबर है .{0,5}
।
सबरूटीन्स के लिए, PCRE के सबरूटीन्स और रूबी के सबरूटीन के बीच प्रमुख अंतर यह है कि रूबी का सिंटैक्स एक बाइट लंबा (?n)
बनाम है \g<n>
, लेकिन रूबी के सबरूटीन का उपयोग कैप्चरिंग के लिए किया जा सकता है, जबकि PCRE एक सबरूटीन खत्म होने के बाद कैप्चर करता है।
अंत में, रूबी के पास अन्य सभी स्वादों की तुलना में लाइन से संबंधित संशोधकों के लिए अलग शब्दार्थ है। आमतौर पर m
अन्य स्वादों में कहा जाने वाला संशोधक हमेशा रूबी में होता है। इसलिए ^
और $
हमेशा एक लाइन की शुरुआत और अंत का मिलान करें न कि केवल स्ट्रिंग की शुरुआत और अंत। यदि आप इस व्यवहार की जरूरत है यह आपको एक बाइट को बचा सकता है, लेकिन यह अगर तुम नहीं आप अतिरिक्त बाइट्स खर्च होंगे, क्योंकि आप प्रतिस्थापित करना होगा ^
और $
साथ \A
और \z
, क्रमशः। इसके अलावा, आमतौर पर कहा जाता है कि संशोधक s
(जो .
मैच लाइनफीड बनाता है ) को m
रूबी में बुलाया जाता है। यह बाइट काउंट को प्रभावित नहीं करता है, लेकिन भ्रम से बचने के लिए इसे ध्यान में रखा जाना चाहिए।
अजगर
पायथन में एक ठोस स्वाद है, लेकिन मैं किसी भी विशेष रूप से उपयोगी सुविधाओं से अवगत नहीं हूं जो आपको कहीं और नहीं मिलेगा।
हालांकि , एक वैकल्पिक स्वाद है जिसका उद्देश्य re
कुछ बिंदु पर मॉड्यूल को बदलना है , और जिसमें बहुत सारी दिलचस्प विशेषताएं हैं। पुनरावृत्ति के लिए समर्थन जोड़ने के अलावा, चर-लंबाई के लुकबाइंड और चरित्र वर्ग संयोजन ऑपरेटर, इसमें फजी मिलान की अनूठी विशेषता भी है । संक्षेप में आप कई त्रुटियों (सम्मिलन, विलोपन, प्रतिस्थापन) को निर्दिष्ट कर सकते हैं जो अनुमति दी गई हैं, और इंजन आपको अनुमानित मैच भी देगा।
ECMAScript
ECMAScript स्वाद बहुत सीमित है, और इसलिए शायद ही कभी गोल्फ के लिए बहुत उपयोगी है। केवल एक चीज जो इसके लिए जा रही है, वह है किसी भी चरित्र के साथ-साथ बिना शर्त खाली चरित्र वर्ग (हमेशा की तरह विपरीत ) के साथ मेल खाने के लिए उपेक्षित खाली चरित्र वर्ग । दुर्भाग्य से, स्वाद में कोई विशेषता नहीं है जो सामान्य समस्याओं के लिए उत्तरार्द्ध को उपयोगी बनाता है।[^]
[]
(?!)
लुआ
लुआ का अपना एक अनूठा स्वाद है, जो काफी सीमित है (जैसे कि आप समूहों को निर्धारित नहीं कर सकते हैं) लेकिन यह उपयोगी और दिलचस्प सुविधाओं के साथ आता है।
- इसमें अंतर्निर्मित चरित्र वर्गों के लिए बड़ी संख्या में शॉर्टहैंड हैं , जिनमें विराम चिह्न, ऊपरी / निचले मामले के वर्ण और हेक्स अंक शामिल हैं।
- इसके साथ
%b
संतुलित तारों का मिलान करने के लिए एक बहुत ही कॉम्पैक्ट सिंटैक्स का समर्थन करता है। उदाहरण के लिए %b()
एक मैच (
और फिर एक मिलान तक सब कुछ )
(सही ढंग से आंतरिक मिलान जोड़े को छोड़ देना)। (
और )
यहां कोई भी दो वर्ण हो सकते हैं।
बढ़ावा
बूस्ट का रेगेक्स स्वाद अनिवार्य रूप से पर्ल का है। हालांकि, इसमें रेगेक्स प्रतिस्थापन के लिए कुछ अच्छी नई विशेषताएं हैं, जिनमें केस परिवर्तन और सशर्तियां शामिल हैं । उत्तरार्द्ध बूस्ट के लिए अद्वितीय है जहाँ तक मुझे पता है।