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


166

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

जवाबों:


789

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

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

सरल शुरू करो

वैचारिक रूप से, सबसे सरल नियमित अभिव्यक्ति शाब्दिक वर्ण हैं। पैटर्न 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
  • 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+--$

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

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

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

पुस्तकें

मुक्त संसाधन

पाद लेख

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


14
आप ट्रायल और एरर मेथड का भी इस्तेमाल कर सकते हैं और ऑनलाइन रेगेक्स टेस्टर और डीबगर का अनुसरण करने से बहुत बड़ी मदद मिल सकती है: regex101.com
Juraj.Lorinc

2
यह ध्यान देने योग्य होगा कि एक समान पैटर्न होने के बावजूद a{,m}, कम से कम जावास्क्रिप्ट, पर्ल और पायथन में एक चीज नहीं है।
निधि मोनिका का मुकदमा

2
यह उल्लेख करने के लिए बहुत लायक होगा कि विभिन्न प्रकार के नियमित अभिव्यक्ति इंजन हैं जिनमें सभी में अलग-अलग फीचर सेट और सिंटैक्टिक नियम हैं।
hek2mgl

1
hackr.io/tutorials/learn- अनियमित-expressions- regex सबसे अच्छा ऑनलाइन rexx ट्यूटोरियल खोजने के लिए एक शानदार जगह है। प्रोग्रामिंग समुदाय द्वारा यहां सभी ट्यूटोरियल प्रस्तुत किए गए हैं और अनुशंसित हैं (एसओ की तरह उत्कीर्ण)।
सौरभ हूडा

2
यह सब यहाँ संक्षेप में लाने के आपके प्रयासों की सराहना करते हैं।
सौरभ तिवारी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.