Regular Expressions
भागने
खोज…
कच्चे स्ट्रिंग साहित्य
पलायन से बचने के लिए यह पठनीयता (और आपकी पवित्रता) के लिए सबसे अच्छा है। यही कारण है कि कच्चे तार के शाब्दिक शब्द आते हैं। (ध्यान दें कि कुछ भाषाओं में सीमांकक की अनुमति होती है, जिन्हें आमतौर पर तार पर पसंद किया जाता है। यह एक अन्य खंड है।)
वे आमतौर पर उसी तरह से काम करते हैं जैसे यह उत्तर बताता है :
[एक] बैकस्लैश,
\
, जिसका अर्थ है "के रूप में सिर्फ एक बैकस्लैश" (जब यह सही एक उद्धरण है कि अन्यथा शाब्दिक समाप्त होगा से पहले आता है को छोड़कर) लिया जाता है - कोई "बच दृश्यों" नई-पंक्तियों, टैब, backspaces, फार्म फ़ीड प्रतिनिधित्व करने के लिए , और इसी तरह।
सभी भाषाओं में उनके पास नहीं है, और जो अलग-अलग वाक्यविन्यास का उपयोग करते हैं। सी # वास्तव में उन्हें शब्दशः स्ट्रिंग शाब्दिक कहते हैं, लेकिन यह एक ही बात है।
अजगर
pattern = r"regex"
pattern = r'regex'
C ++ (11+)
यहाँ वाक्य विन्यास अत्यंत बहुमुखी है। एकमात्र नियम एक सीमांकक का उपयोग करना है जो रेगेक्स में कहीं भी प्रकट नहीं होता है। यदि आप ऐसा करते हैं, तो स्ट्रिंग में किसी भी चीज के लिए कोई अतिरिक्त पलायन आवश्यक नहीं है। ध्यान दें कि कोष्ठक ()
रेगेक्स का हिस्सा नहीं है:
pattern = R"delimiter(regex)delimiter";
VB.NET
बस एक सामान्य स्ट्रिंग का उपयोग करें। बैकस्लैश ALWAYS शाब्दिक हैं ।
सी#
pattern = @"regex";
नोट इस वाक्य रचना भी है कि अनुमति देता है ""
के एक फार्म के रूप में बच गए (दो डबल कोट्स) "
।
स्ट्रिंग्स
अधिकांश प्रोग्रामिंग भाषाओं में, स्ट्रिंग स्ट्रिंग से उत्पन्न स्ट्रिंग में एक बैकस्लैश होने के लिए, प्रत्येक बैकस्लैश को स्ट्रिंग शाब्दिक में दोगुना किया जाना चाहिए। अन्यथा, यह अगले चरित्र के लिए एक पलायन के रूप में व्याख्या की जाएगी।
दुर्भाग्य से, रेगेक्स द्वारा आवश्यक किसी भी बैकस्लैश को शाब्दिक बैकलैश होना चाहिए। यही कारण है कि जब रिजेक्स को स्ट्रिंग लिटरल्स से उत्पन्न किया जाता है, तो "बच निकले" ( \\
) होना आवश्यक हो जाता है।
इसके अलावा, स्ट्रिंग शाब्दिक में उद्धरण ( "
या '
) से बचने की आवश्यकता हो सकती है, जिसके आधार पर स्ट्रिंग शाब्दिक को घेर लिया जाता है। कुछ भाषाओं में, स्ट्रिंग के लिए उद्धरणों की किसी भी शैली का उपयोग करना संभव है (इसके लिए सबसे पठनीय एक चुनें) पूरे स्ट्रिंग शाब्दिक भाग)।
कुछ भाषाओं में (जैसे: जावा <= 7), रेगीज़ को सीधे शाब्दिक रूप में व्यक्त नहीं किया जा सकता है जैसे कि /\w/
; उन्हें स्ट्रिंग से उत्पन्न किया जाना चाहिए, और आमतौर पर स्ट्रिंग शाब्दिक का उपयोग किया जाता है - इस मामले में, "\\w"
। इन मामलों में, शाब्दिक पात्रों जैसे उद्धरण, बैकस्लैश, आदि से बचने की आवश्यकता होती है। इसे पूरा करने का सबसे आसान तरीका एक उपकरण (जैसे RegexPlanet ) का उपयोग करके हो सकता है। यह विशिष्ट उपकरण जावा के लिए डिज़ाइन किया गया है, लेकिन यह समान स्ट्रिंग सिंटैक्स के साथ किसी भी भाषा के लिए काम करेगा।
किन किरदारों को बचकर निकलने की जरूरत है?
अक्षर भागने वह है जो कुछ वर्णों (खोजों में हेरफेर करने के लिए रेगेक्स इंजन द्वारा आरक्षित) को शाब्दिक रूप से खोजा और इनपुट स्ट्रिंग में पाया जाता है। बचना संदर्भ पर निर्भर करता है, इसलिए यह उदाहरण स्ट्रिंग या सीमांकक को कवर नहीं करता है।
बैकस्लैश
यह कहना कि बैकस्लैश "पलायन" चरित्र थोड़ा भ्रामक है। बैकस्लैश बच जाता है और बैकलैश लाता है; यह वास्तव में इसके सामने चरित्र के मेटाचैकर बनाम शाब्दिक स्थिति पर या बंद हो जाता है।
रीगेक्स में कहीं भी शाब्दिक बैकस्लैश का उपयोग करने के लिए, इसे किसी अन्य बैकस्लैश द्वारा बच जाना चाहिए।
भागने (चरित्र वर्ग के बाहर)
ऐसे कई पात्र हैं जिन्हें वस्तुतः (कम से कम चार वर्ग से बाहर) ले जाने की आवश्यकता है:
- कोष्ठक:
[]
- कोष्ठक:
()
- घुंघराले ब्रेसिज़:
{}
- संचालक:
*
,+
?
,|
- एंकर:
^
,$
- अन्य:
.
,\
- आदेश में एक शाब्दिक उपयोग करने के लिए
^
प्रारंभ या एक शाब्दिक पर$
एक regex के अंत में, चरित्र भाग निकले किया जाना चाहिए। - कुछ फ्लेवर केवल
^
और$
मेटाचेचर के रूप में उपयोग करते हैं जब वे क्रमशः रेगेक्स के शुरू या अंत में होते हैं। उन स्वादों में, कोई अतिरिक्त पलायन आवश्यक नहीं है। यह आम तौर पर वैसे भी बचने के लिए सबसे अच्छा है।
चरित्र वर्गों के भीतर भागने
- चौकोर कोष्ठक (
[
और]
) से बचने के लिए सबसे अच्छा अभ्यास है जब वे एक चार वर्ग में शाब्दिक के रूप में दिखाई देते हैं। कुछ शर्तों के तहत , स्वाद के आधार पर इसकी आवश्यकता नहीं होती है , लेकिन यह पठनीयता को नुकसान पहुँचाता है। - कैरेट,
^
, एक मेटा चरित्र है जब एक वर्ण वर्ग में पहले चरित्र के रूप में रखा जाता है:[^aeiou]
। चेर क्लास में कहीं भी, यह सिर्फ एक शाब्दिक चरित्र है। - डैश,
-
, एक मेटा कैरेक्टर है, जब तक कि यह कैरेक्टर क्लास की शुरुआत या अंत में न हो। यदि वर्ण वर्ग में पहला वर्ण एक कैरेट^
, तो यह एक शाब्दिक होगा यदि यह वर्ण वर्ग में दूसरा वर्ण है।
प्रतिस्थापन से बचना
प्रतिस्थापन के भीतर भागने के भी नियम हैं, लेकिन उपरोक्त नियमों में से कोई भी लागू नहीं होता है। केवल मेटाचैटर $
और \
, कम से कम जब $
का उपयोग संदर्भ कैप्चर समूहों (जैसे समूह 1 के लिए $1
1) के लिए किया जा सकता है। शाब्दिक $
उपयोग करने के लिए, इसे छोड़ दें: \$5.00
। इसी तरह \
: C:\\Program Files\\
।
BRE अपवाद
जबकि ERE (विस्तारित नियमित अभिव्यक्तियाँ) ठेठ, पर्ल-शैली वाक्यविन्यास को प्रतिबिंबित करती है, जब बचने की बात आती है, तो BRE (मूल नियमित अभिव्यक्ति) में महत्वपूर्ण अंतर होता है:
- अलग शॉर्टहैंड सिंटैक्स है। सब के सब
\d
,\s
,\w
और इतने पर चला गया है। इसके बजाय, इसका अपना सिंटैक्स है (जिसे POSIX भ्रामक रूप से "वर्ण वर्ग" कहता है), जैसे[:digit:]
। ये निर्माण एक चरित्र वर्ग के भीतर होने चाहिए। - कुछ मेटाचेचर्स (
.
,*
,^
,$
) हैं जो सामान्य रूप से उपयोग किए जा सकते हैं। अन्य सभी मेटाचट्रैक्टर्स को अलग तरीके से भाग जाना चाहिए:
ब्रेसेस {}
-
a{1,2}
मेल खाताa{1,2}
। या तोa
याaa
मैच के लिए,a\{1,2\}
कोष्ठक ()
-
(ab)\1
अमान्य है, क्योंकि कोई कैप्चर समूह नहीं है। इसे ठीक करने के लिए औरabab
उपयोग\(ab\)\1
मेल खाता है
बैकस्लैश
- चार्ल क्लासेस (जिसे POSIX में ब्रैकेट एक्सप्रेशन कहा जाता है) के अंदर, बैकस्लैश एक मेटाचैकर नहीं है (और इसमें भागने की ज़रूरत नहीं है)।
[\d]
या तो\
याd
मेल खाता है। - कहीं भी, हमेशा की तरह बच जाते हैं।
अन्य
-
+
और?
शाब्दिक हैं। यदि BRE इंजन उन्हें मेटाचैकर के रूप में समर्थन करता है, तो उन्हें\?
_ के रूप में बच जाना चाहिए\?
और\+
।
/ सीमांकक /
कई भाषाएं रेगेक्स को विशिष्ट वर्णों के एक जोड़े के बीच संलग्न या सीमांकित करने की अनुमति देती हैं, आमतौर पर आगे स्लैश /
।
परिसीमन से बचने पर प्रभाव पड़ता है: यदि सीमांकक /
और रेगेक्स को /
शाब्दिक रूप से देखना है, तो इससे पहले कि शाब्दिक ( \/
) हो सकता है, आगे की स्लैश से बच जाना चाहिए।
अत्यधिक भागने से पठनीयता को नुकसान पहुंचता है, इसलिए उपलब्ध विकल्पों पर विचार करना महत्वपूर्ण है:
जावास्क्रिप्ट अद्वितीय है क्योंकि यह एक परिसीमन के रूप में आगे की स्लैश की अनुमति देता है, लेकिन कुछ और नहीं (हालांकि यह कड़े regexes की अनुमति देता है)।
उदाहरण के लिए, पर्ल लगभग कुछ भी एक सीमांकक होने की अनुमति देता है। यहां तक कि अरबी वर्ण:
$str =~ m ش ش
पर्ल के प्रलेखन में विशिष्ट नियमों का उल्लेख किया गया है।
PCRE दो प्रकार के सीमांकक देता है: मिलान किए गए सीमांकक और कोष्ठक-शैली के परिसीमनकर्ता। मिलान किए गए सीमांकक एक एकल वर्ण की जोड़ी का उपयोग करते हैं, जबकि ब्रैकेट-शैली के चित्रकार एक जोड़े के पात्रों का उपयोग करते हैं जो एक उद्घाटन और समापन जोड़ी का प्रतिनिधित्व करता है।
- सीमांकक मिलान:
!"#$%&'*+,./:;=?@^_`|~-
- ब्रैकेट-शैली के सीमांकक:
()
,{}
,[]
,<>