जावास्क्रिप्ट में दो तारों के बीच एक स्ट्रिंग प्राप्त करने के लिए नियमित अभिव्यक्ति
सबसे पूर्ण समाधान जो अधिकांश मामलों में काम करेगा, एक आलसी डॉट मिलान पैटर्न के साथ कैप्चरिंग समूह का उपयोग कर रहा है । हालांकि, एक डॉट जावास्क्रिप्ट regex में लाइन ब्रेक वर्णों से मेल नहीं खाता है, तो, क्या 100% मामलों में काम करेंगे एक है या / / निर्माणों।.[^][\s\S][\d\D][\w\W]
ECMAScript 2018 और नए संगत समाधान
ECMAScript 2018 का समर्थन करने वाले जावास्क्रिप्ट वातावरण में , sसंशोधक .किसी भी चार्ट को लाइन ब्रेक चार्ट सहित मिलान करने की अनुमति देता है, और रेगेक्स इंजन चर लंबाई के लुकबाइंड का समर्थन करता है। तो, आप एक regex का उपयोग कर सकते हैं
var result = s.match(/(?<=cow\s+).*?(?=\s+milk)/gs); // Returns multiple matches if any
// Or
var result = s.match(/(?<=cow\s*).*?(?=\s*milk)/gs); // Same but whitespaces are optional
दोनों मामलों में, वर्तमान स्थिति की जाँच cowकिसी 1/0 या अधिक व्हाट्सएप के साथ की जाती है cow, फिर किसी भी 0+ चार्ट को जितना संभव हो उतना मिलान किया जाता है और उपभोग किया जाता है (= मैच मूल्य में जोड़ा जाता है), और उसके बाद milkकिसी के साथ जांच की जाती है इस प्रतिस्थापन से पहले 1 / या अधिक व्हाट्सएप)।
परिदृश्य 1: सिंगल-लाइन इनपुट
यह और नीचे के अन्य सभी परिदृश्य सभी जावास्क्रिप्ट वातावरण द्वारा समर्थित हैं। उत्तर के नीचे उपयोग उदाहरण देखें।
cow (.*?) milk
cowपहले पाया जाता है, फिर एक स्थान, फिर लाइन ब्रेक चार्ज के अलावा कोई भी 0+ चार्ट, जितना संभव हो उतना *?आलसी क्वांटिफायर होता है, समूह 1 में कब्जा कर लिया जाता है और फिर एक स्थान milkका पालन करना चाहिए (और वे मेल खाते हैं और भस्म हो जाते हैं , भी) )।
परिदृश्य 2: बहुस्तरीय इनपुट
cow ([\s\S]*?) milk
यहां, cowऔर पहले एक स्पेस का मिलान किया जाता है, फिर किसी भी 0+ चार्ट को जितना संभव हो उतना कम मिलान किया जाता है और ग्रुप 1 में कैप्चर किया जाता है, और फिर एक स्पेस से milkमिलान किया जाता है।
परिदृश्य 3: ओवरलैपिंग मैच
यदि आपके पास एक स्ट्रिंग है >>>15 text>>>67 text2>>>और आपको >>>+ number+ whitespaceऔर के बीच में 2 मैच प्राप्त करने की आवश्यकता है >>>, तो आप इसका उपयोग नहीं कर सकते हैं />>>\d+\s(.*?)>>>/gक्योंकि यह केवल पहले मैच का पता लगाने पर पहले से भस्म>>> होने वाले तथ्य के कारण केवल 1 मैच होगा । आप वास्तव में "gobbling" के बिना पाठ उपस्थिति के लिए जाँच करने के लिए एक सकारात्मक रूपांतर का उपयोग कर सकते हैं (यानी मैच के लिए संलग्न):67
/>>>\d+\s(.*?)(?=>>>)/g
ऑनलाइन regex डेमो उपज text1और text2समूह 1 सामग्री के रूप में देखें ।
यह भी देखें कि स्ट्रिंग के लिए सभी संभावित अतिव्यापी मैचों को कैसे प्राप्त करें ।
प्रदर्शन के विचार
.*?रेगेक्स पैटर्न के अंदर आलसी डॉट मिलान पैटर्न ( ) बहुत लंबा इनपुट दिए जाने पर स्क्रिप्ट निष्पादन को धीमा कर सकता है। कई मामलों में, अनियंत्रित-लूप तकनीक अधिक हद तक मदद करती है। सभी के बीच cowऔर milkसे हड़पने की कोशिश करते हुए "Their\ncow\ngives\nmore\nmilk", हम देखते हैं कि हमें बस उन सभी लाइनों से मेल खाना है जो milkइस तरह से शुरू नहीं होते हैं , इस प्रकार, cow\n([\s\S]*?)\nmilkहम कर सकते हैं:
/cow\n(.*(?:\n(?!milk$).*)*)\nmilk/gm
रेगेक्स डेमो देखें (यदि हो सकता है \r\n, तो उपयोग करें /cow\r?\n(.*(?:\r?\n(?!milk$).*)*)\r?\nmilk/gm)। इस छोटे परीक्षण स्ट्रिंग के साथ, प्रदर्शन लाभ नगण्य है, लेकिन बहुत बड़े पाठ के साथ, आप अंतर महसूस करेंगे (विशेषकर यदि लाइनें लंबी हैं और लाइन ब्रेक बहुत अधिक नहीं हैं)।
जावास्क्रिप्ट में नमूना regex उपयोग:
//Single/First match expected: use no global modifier and access match[1]
console.log("My cow always gives milk".match(/cow (.*?) milk/)[1]);
// Multiple matches: get multiple matches with a global modifier and
// trim the results if length of leading/trailing delimiters is known
var s = "My cow always gives milk, thier cow also gives milk";
console.log(s.match(/cow (.*?) milk/g).map(function(x) {return x.substr(4,x.length-9);}));
//or use RegExp#exec inside a loop to collect all the Group 1 contents
var result = [], m, rx = /cow (.*?) milk/g;
while ((m=rx.exec(s)) !== null) {
result.push(m[1]);
}
console.log(result);
आधुनिक String#matchAllपद्धति का उपयोग कर
const s = "My cow always gives milk, thier cow also gives milk";
const matches = s.matchAll(/cow (.*?) milk/g);
console.log(Array.from(matches, x => x[1]));