खोज…


नई पंक्ति ("\ n") से मिलान (?) क्यों नहीं होता है?

.* रेगेक्स में मूल रूप से इसका अर्थ है "इनपुट के अंत तक सब कुछ पकड़ो"।

तो, सरल तार के लिए, hello world तरह .* पूरी तरह से काम करता है। लेकिन अगर आपके पास एक स्ट्रिंग है, उदाहरण के लिए, किसी फ़ाइल में रेखाएँ, तो ये लाइनें एक लाइन विभाजक द्वारा अलग हो जाएंगी, जैसे कि यूनिक्स जैसी प्रणालियों पर \n (newline) और \r\n (गाड़ी वापसी और नई लाइन) खिड़कियाँ।

सबसे regex इंजन में डिफ़ॉल्ट रूप से, . न्यूलाइन वर्णों से मेल नहीं खाता है, इसलिए प्रत्येक तार्किक पंक्ति के अंत में मिलान बंद हो जाता है। यदि आप चाहते हैं . वास्तव में सब कुछ से मेल खाने के लिए, न्यूलाइन सहित, आपको अपनी पसंद के regex इंजन में "डॉट-मैच-ऑल" मोड को सक्षम करने की आवश्यकता है (उदाहरण के लिए, पायथन में re.DOTALL ध्वज जोड़ें, या PCRE में /s

एक रेगेक्स कुछ समापन कोष्ठक / कोष्ठक क्यों छोड़ता है और बाद में उनसे मेल खाता है?

इस उदाहरण पर विचार करें:

वह कैफे "दोस्तोवस्की" में गया और कहा: "शुभ संध्या।"

यहां हमारे पास दो सेट हैं। मान लेते हैं कि हम दोनों का मिलान करना चाहते हैं, ताकि हमारा रेगेक्स "Dostoevski" और "Good evening." "Dostoevski" मेल खाए "Good evening."

सबसे पहले, आपको इसे सरल रखने के लिए लुभाया जा सकता है:

".*"  # matches a quote, then any characters until the next quote

लेकिन यह काम नहीं करता है: यह में पहली बोली से मेल खाता है "Dostoevski" और में बंद करने वाला उद्धरण जब तक "Good evening." , सहित and said: भाग। Regex101 डेमो

यह क्यों हुआ?

यह तब होता है क्योंकि रेगेक्स इंजन, जब उसका सामना होता है .* , इनपुट को बहुत अंत तक "खाता है"। फिर, यह अंतिम मैच के लिए की जरूरत है " पीठ बंद" मैच के अंत, दे पहले तक मिलान वाला पाठ जाने से इसलिए, यह। " " पाया जाता है - और यह निश्चित रूप से, है, पिछले " मैच में "Good evening." भाग के अंत में।

इसे कैसे रोकें और पहले उद्धरणों से बिल्कुल मेल खाएं?

[^"]* उपयोग करें। यह सभी इनपुट नहीं खाता है - केवल पहले तक " , बस आवश्यकतानुसार। Regex101 डेमो



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow