सीखना नियमित भाव [बंद]

Aug 07 2008

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

जवाब

802 GregBacon May 03 2010 at 23:09

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

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

सरल शुरू करो

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

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

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

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

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

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

मेनू के रूप में चरित्र वर्गों के बारे में सोचो: सिर्फ एक उठाओ।

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

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

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

एक बार काफी नहीं है

वहां से, आप अपने पैटर्न के कुछ हिस्सों को क्वांटिफायर के साथ दोहरा सकते हैं । उदाहरण के लिए, पैटर्न ab?c'एबीसी' या 'एसी' से मेल खाता है क्योंकि ?क्वांटिफायर उपपट्ट को वैकल्पिक बनाता है। अन्य मात्रात्मक हैं

  • * (शून्य या अधिक बार)
  • + (एक या अधिक बार)
  • {n}(बिल्कुल n बार)
  • {n,}(कम से कम n बार)
  • {n,m}(कम से कम n बार लेकिन m बार से अधिक नहीं )

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

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

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

कुछ अन्य उपयोगी उदाहरण:

  • [0-9]+(और इसके समकक्ष \d+) किसी भी गैर-नकारात्मक पूर्णांक से मेल खाता है
  • \d{4}-\d{2}-\d{2} 2019-01-01 की तरह मैच की तारीखें

समूहन

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

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

अदल-बदल

इससे पहले, हमने 'निक' या 'निक' में से एक का मिलान किया। एक और विकल्प के रूप में के साथ है Nick|nick। याद रखें कि प्रत्यावर्तन में इसके बाईं ओर सब कुछ और इसके दाईं ओर सब कुछ शामिल है। |, जैसे , के दायरे को सीमित करने के लिए समूहीकरण कोष्ठक का उपयोग करें (Nick|nick)

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

भागने

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

लालच

नियमित अभिव्यक्ति क्वांटिफायर लालची हैं। इसका मतलब है कि वे यथासंभव अधिक पाठ से मेल खाते हैं, जबकि संभवतः पूरे पैटर्न को सफलतापूर्वक मिलान करने की अनुमति देते हैं।

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

"नमस्ते," उसने कहा, "आप कैसे हैं?"

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

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

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

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

एंकर

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

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

-- This is a comment --

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

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

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

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

  • RegExr (जावास्क्रिप्ट के लिए)
  • पर्ल: YAPE: Regex व्याख्या
  • रेगेक्स कोच ( सीएल-पीपीसीआरई द्वारा समर्थित इंजन )
  • रेगेक्सपाल (जावास्क्रिप्ट के लिए)
  • नियमित अभिव्यक्तियाँ ऑनलाइन परीक्षक
  • रेगेक्स बडी
  • रेगेक्स 101 (पीसीआरई, जावास्क्रिप्ट, पायथन, गोलंग के लिए)
  • दृश्य RegExp
  • एक्सप्रेसो (.NET के लिए)
  • रूब्युलर (रूबी के लिए)
  • नियमित अभिव्यक्ति पुस्तकालय (सामान्य परिदृश्यों के लिए पूर्वनिर्धारित संदर्भ)
  • Txt2RE
  • रेगेक्स परीक्षक (जावास्क्रिप्ट के लिए)
  • रेगेक्स स्टॉर्म (.NET के लिए)
  • डीबगेज (दृश्य रेगेक्स परीक्षक और सहायक)

पुस्तकें

  • मास्टरींग रेगुलर एक्सप्रेशंस , दूसरा संस्करण और तीसरा संस्करण ।
  • रेगुलर एक्सप्रेशंस चीट शीट
  • रेगेक्स कुकबुक
  • खुद को रेगुलर एक्सप्रेशन सिखाएं

मुक्त संसाधन

  • RegexOne - सरल, इंटरैक्टिव अभ्यास के साथ जानें।
  • नियमित अभिव्यक्तियाँ - वह सब कुछ जो आपको पता होना चाहिए (पीडीएफ श्रृंखला)
  • रेगेक्स सिंटेक्स सारांश
  • Regexes कैसे काम करता है

पाद लेख

Above: उपरोक्त कथन .किसी भी वर्ण से मेल खाता है, शैक्षणिक उद्देश्यों के लिए एक सरलीकरण है जो कड़ाई से सच नहीं है। डॉट, न्यूलाइन को छोड़कर किसी भी वर्ण से मेल खाता है "\n", लेकिन व्यवहार में आप शायद ही किसी पैटर्न की अपेक्षा करते हैं जैसे कि .+एक नई सीमा को पार करना। पर्ल रीगेक्स में एक /sस्विच और जावा है Pattern.DOTALL, उदाहरण के लिए, .किसी भी चरित्र से मेल खाने के लिए । ऐसी भाषाएं जिनके पास ऐसी कोई सुविधा नहीं है, आप [\s\S]"किसी भी व्हाट्सएप या किसी भी गैर-व्हाट्सएप" से मेल खाने के लिए कुछ अन्य शब्दों में उपयोग कर सकते हैं ।