नियमित अभिव्यक्ति सीखना

मैं वास्तव में नियमित अभिव्यक्तियों को समझ नहीं पा रहा हूं। क्या आप उन्हें आसानी से पालन करने के तरीके में समझा सकते हैं? यदि कोई ऑनलाइन उपकरण या किताबें हैं, तो क्या आप उनसे लिंक भी कर सकते हैं?

0
ro fr bn

1 उत्तर

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

यदि आप नियमित रूप से अभिव्यक्तियों के बारे में सोचते हैं जो बिल्डिंग ब्लॉक के रूप में आप मिश्रण और मिलान कर सकते हैं, तो यह आपको सीखने में मदद करता है कि कैसे अपने स्वयं के पैटर्न लिखना और डीबग करना है, लेकिन दूसरों द्वारा लिखे गए पैटर्न को कैसे समझना है।

सरल शुरू करो

संकल्पनात्मक रूप से, सबसे सरल नियमित अभिव्यक्ति शाब्दिक वर्ण हैं। पैटर्न <�कोड> एन </कोड> चरित्र 'एन' से मेल खाता है।

एक दूसरे के मिलान अनुक्रमों के बगल में नियमित अभिव्यक्तियां। उदाहरण के लिए, पैटर्न Nick अनुक्रम 'एन' से मेल खाता है 'i' के बाद 'c' के बाद 'k' के बाद।

यदि आपने कभी यूनिक्स पर grep का उपयोग किया है? भले ही केवल सामान्य दिखने वाले तारों की खोज हो? आप पहले ही नियमित अभिव्यक्तियों का उपयोग कर रहे हैं! ( grep में re नियमित अभिव्यक्तियों को संदर्भित करता है।)

मेनू से ऑर्डर करें

थोड़ी जटिलता जोड़ना, आप पैटर्न 'कोड> [एनएन] ick के साथ' निक 'या' निक 'से मेल खा सकते हैं। स्क्वायर ब्रैकेट्स में हिस्सा एक वर्ण वर्ग है, जिसका अर्थ यह है कि यह संलग्न वर्णों में से एक से मेल खाता है। आप वर्ण वर्गों में श्रेणियों का भी उपयोग कर सकते हैं, इसलिए [a-c] या तो 'ए' या 'बी' या 'सी' से मेल खाता है।

पैटर्न विशेष है: केवल एक शाब्दिक बिंदु से मेल खाने के बजाय, यह किसी भी वर्ण ? से मेल खाता है। यह वास्तव में एक ही अवधारणात्मक रूप से बड़ा चरित्र वर्ग [-.?+%$ ए-ज़ा-जे 0-9 ...] जैसा ही है।

मेनू वर्ग के रूप में चरित्र वर्गों के बारे में सोचें: केवल एक चुनें।

सहायक शॉर्टकट्स

का उपयोग करके आप बहुत सारे टाइपिंग को बचा सकते हैं, और सामान्य पैटर्न के लिए अन्य शॉर्टकट भी हैं। मान लें कि आप गैर-ऋणात्मक पूर्णांक से मेल खाना चाहते हैं: लिखने का एक तरीका [0-9] + है। अंक एक लगातार मिलान लक्ष्य होते हैं, इसलिए आप गैर-नकारात्मक पूर्णांक से मेल खाने के लिए \ d + का उपयोग कर सकते हैं। अन्य \ s (व्हाइटस्पेस) और \ w (शब्द वर्ण: अल्फान्यूमेरिक्स या अंडरस्कोर) हैं।

अपरकेज्ड वेरिएंट उनके पूरक हैं, इसलिए \ S किसी भी non -whitespace वर्ण से मेल खाता है, उदाहरण के लिए।

एक बार पर्याप्त नहीं है

वहां से, आप quantifiers के साथ अपने पैटर्न के कुछ हिस्सों को दोहरा सकते हैं। उदाहरण के लिए, पैटर्न ab? C मैचों 'एबीसी' या 'एसी' मिलान करता है क्योंकि ? क्वांटिफायर उप-पैटर्न बनाता है जो इसे वैकल्पिक रूप से संशोधित करता है। अन्य क्वांटिफायर हैं

  • * (zero or more times)
  • + (one or more times)
  • {n} (exactly n times)
  • {n,} (at least n times)
  • {n,m} (at least n times but no more than m times)

इन ब्लॉकों में से कुछ को एक साथ रखकर, पैटर्न [Nn] * ick सभी से मेल खाता है

  • ick
  • निक
  • निक
  • Nnick
  • nNick
  • nnick
  • (और इसी तरह)

पहला मैच एक महत्वपूर्ण सबक दिखाता है: * हमेशा सफल होता है! कोई भी पैटर्न शून्य बार मिलान कर सकता है।

समूहीकरण

एक क्वांटिफायर पैटर्न को तत्काल बाईं ओर संशोधित करता है। आप '0abc0', '0abcabc0' से मिलान करने के लिए 0abc + 0 की अपेक्षा कर सकते हैं, और आगे भी, लेकिन प्लस क्वांटिफ़ायर के बाईं ओर तुरंत पैटर्न c है । इसका अर्थ है 0abc + 0 मैचों '0abc0', '0abcc0', '0abccc0', और इसी तरह से।

सिरों पर शून्य के साथ 'एबीसी' के एक या अधिक अनुक्रमों से मेल खाने के लिए, 0 (abc) +0 का उपयोग करें। कोष्ठक एक उप-पैटर्न को इंगित करते हैं जिसे इकाई के रूप में प्रमाणित किया जा सकता है। नियमित अभिव्यक्ति इंजनों के लिए यह भी आम है कि एक संश्लेषित समूह से मेल खाने वाले इनपुट टेक्स्ट के हिस्से को सहेजने या "कैप्चर" करना आम है। इस तरह बिट्स निकालने से सूचकांक और substr की गणना करने से अधिक लचीला और कम त्रुटि-प्रवण होता है।

अदल-बदल

Earlier, we saw one way to match either 'Nick' or 'nick'. Another is with अदल-बदल as in Nick|nick. Remember that अदल-बदल includes everything to its left and everything to its right. Use समूहीकरण parentheses to limit the scope of |, e.g., (Nick|nick).

एक और उदाहरण के लिए, आप [ac] को a | b | c के रूप में समतुल्य रूप से लिख सकते हैं, लेकिन यह उप-शीर्ष होने की संभावना है क्योंकि कई कार्यान्वयन मानते हैं कि विकल्पों की लंबाई 1 से अधिक होगी ।

भागने

हालांकि कुछ पात्र खुद से मेल खाते हैं, दूसरों के विशेष अर्थ हैं। पैटर्न \ d + बैकस्लैश से मेल नहीं खाता है, इसके बाद लोअरकेस डी के बाद प्लस साइन के बाद: इसे प्राप्त करने के लिए, हम \\ d \ + का उपयोग करेंगे। बैकस्लैश निम्न वर्ण से विशेष अर्थ को हटा देता है।

लालच

नियमित अभिव्यक्ति क्वांटिफायर लालची हैं। इसका अर्थ यह है कि वे पूरे पैटर्न को सफलतापूर्वक मिलान करने की अनुमति देते हुए जितना संभव हो उतना टेक्स्ट मिलान कर सकते हैं।

उदाहरण के लिए, इनपुट कहें

"हैलो," उसने कहा, "तुम कैसे हो?"

आप "। +" को केवल 'हैलो' से मिलान करने की उम्मीद कर सकते हैं और फिर आश्चर्यचकित होंगे जब आप देखते हैं कि यह 'हैलो' से 'आप' के माध्यम से मेल खाता है।

लालची से स्विच करने के लिए जो आप सावधान रह सकते हैं, क्वांटिफ़ायर को अतिरिक्त ? जोड़ें। अब आप समझते हैं कि कैसे \ ((। +?) \) , आपके प्रश्न का उदाहरण काम करता है। यह एक शाब्दिक बाएं-कोष्ठक के अनुक्रम से मेल खाता है, उसके बाद एक या अधिक वर्ण होते हैं, और दाएं-कोष्ठक द्वारा समाप्त किया जाता है।

यदि आपका इनपुट '(123) (456)' है, तो पहला कैप्चर '123' होगा। गैर लालची क्वांटिफायर शेष पैटर्न को जितनी जल्दी हो सके मिलान शुरू करने की अनुमति देना चाहते हैं।

(आपके भ्रम के रूप में, मुझे किसी भी नियमित अभिव्यक्ति बोली के बारे में पता नहीं है, जहां ((। +?)) वही काम करेगा। मुझे संदेह है कि रास्ते में कहीं भी ट्रांसमिशन में कुछ खो गया है। )

लंगर

अपने इनपुट की शुरुआत में और $ केवल अंत में मिलान करने के लिए मिलान करने के लिए विशेष पैटर्न ^ का उपयोग करें। अपने पैटर्न के साथ "बुकेंड" बनाना जहां आप कहते हैं, "मुझे पता है कि आगे और पीछे क्या है, लेकिन मुझे सब कुछ दें" एक उपयोगी तकनीक है।

मान लें कि आप फॉर्म की टिप्पणियों से मेल खाना चाहते हैं

- यह एक टिप्पणी है -

आप ^ - \ s + (। +) \ s + - $ लिखेंगे।

अपना खुद का बनाओ

नियमित अभिव्यक्ति रिकर्सिव हैं, इसलिए अब आप इन बुनियादी नियमों को समझते हैं, फिर भी आप उन्हें जोड़ सकते हैं।

लेखन और डिबगिंग regexes के लिए उपकरण:

पुस्तकें

नि: शुल्क संसाधन

पाद लेख

?: The statement above that . matches any character is a simplification for pedagogical purposes that is not strictly true. Dot matches any character except newline, "\n", but in practice you rarely expect a pattern such as .+ to cross a newline boundary. Perl regexes have a /s switch and Java Pattern.DOTALL, for example, to make . match any character at all. For languages that don't have such a feature, you can use something like [\s\S] to match "any whitespace or any non-whitespace", in other words anything.

0
जोड़ा
आप परीक्षण और त्रुटि विधि का भी उपयोग कर सकते हैं और ऑनलाइन रेगेक्स परीक्षक का पालन करने और डीबगर की एक बड़ी सहायता हो सकती है: regex101.com
जोड़ा लेखक Juraj.Lorinc, स्रोत
यह उल्लेख करना बहुत महत्वपूर्ण होगा कि विभिन्न प्रकार के नियमित अभिव्यक्ति इंजन हैं जिनमें सभी के पास अलग-अलग फीचर सेट और सिंटैक्टिक नियम हैं।
जोड़ा लेखक hek2mgl, स्रोत
यह उल्लेखनीय होगा कि, समान पैटर्न होने के बावजूद, a {, m} कम से कम जावास्क्रिप्ट, पर्ल और पायथन में नहीं है।
जोड़ा लेखक Nic Hartley, स्रोत
hackr.io/tutorials/learn-regular-expressions-regex एक महान है सर्वश्रेष्ठ ऑनलाइन regex ट्यूटोरियल खोजने के लिए जगह। प्रोग्रामिंग समुदाय द्वारा यहां दिए गए सभी ट्यूटोरियल सबमिट और अनुशंसित (एसओ जैसे ऊपर) हैं।
जोड़ा लेखक Saurabh Hooda, स्रोत