इस उत्तर में प्रयुक्त शब्दावली
- मैच आपके स्ट्रिंग के खिलाफ अपने RegEx पैटर्न को चलाने के परिणाम को इंगित करता है जैसे
someString.match(regexPattern)
:।
- मिलान किए गए पैटर्न इनपुट स्ट्रिंग के सभी मिलान भागों को दर्शाते हैं, जो सभी मैच सरणी के अंदर रहते हैं । ये इनपुट स्ट्रिंग के अंदर आपके पैटर्न के सभी उदाहरण हैं।
- मिलान किए गए समूह RegEx पैटर्न में परिभाषित किए गए सभी समूहों को पकड़ने का संकेत देते हैं। (कोष्ठक के अंदर के पैटर्न, जैसे:,
/format_(.*?)/g
जहां (.*?)
एक मिलान समूह होगा।) ये मिलान किए गए पैटर्न के भीतर रहते हैं ।
विवरण
मिलान किए गए समूहों तक पहुंचने के लिए , प्रत्येक मिलान किए गए पैटर्न में , आपको मैच पर पुनरावृति के लिए एक फ़ंक्शन या कुछ समान होना चाहिए । ऐसे कई तरीके हैं जिनसे आप ऐसा कर सकते हैं, जैसे कि अन्य उत्तर दिखाते हैं। अधिकांश अन्य उत्तर सभी मिलान किए गए पैटर्न पर पुनरावृति करने के लिए थोड़ी देर के लूप का उपयोग करते हैं , लेकिन मुझे लगता है कि हम सभी उस दृष्टिकोण के साथ संभावित खतरों को जानते हैं। new RegExp()
केवल एक पैटर्न के बजाय मैच करना आवश्यक है, जो केवल एक टिप्पणी में उल्लिखित है। ऐसा इसलिए है क्योंकि .exec()
विधि एक जनरेटर फ़ंक्शन के समान व्यवहार करती है - यह हर बार मैच होने पर रुकती है , लेकिन .lastIndex
अगले .exec()
कॉल पर इसे वहां से जारी रखने के लिए रखती है ।
कोड उदाहरण
नीचे एक समारोह का एक उदाहरण है searchString
जो एक रिटर्न Array
सब से मेल नहीं खाते पैटर्न है, जहां प्रत्येक match
एक है Array
सभी के साथ युक्त मिलान किया समूहों । थोड़ी देर लूप का उपयोग करने के बजाय, मैंने दोनों Array.prototype.map()
फ़ंक्शन के साथ-साथ एक अधिक प्रदर्शन करने वाले तरीके का उपयोग करके उदाहरण प्रदान किए हैं - एक सादे- for
लूप का उपयोग करके ।
संक्षिप्त संस्करण (कम कोड, अधिक संश्लिष्ट चीनी)
ये कम प्रदर्शन करने वाले हैं क्योंकि वे मूल रूप forEach
से तेज- for
लूप के बजाय एक- लूप को लागू करते हैं ।
// Concise ES6/ES2015 syntax
const searchString =
(string, pattern) =>
string
.match(new RegExp(pattern.source, pattern.flags))
.map(match =>
new RegExp(pattern.source, pattern.flags)
.exec(match));
// Or if you will, with ES5 syntax
function searchString(string, pattern) {
return string
.match(new RegExp(pattern.source, pattern.flags))
.map(match =>
new RegExp(pattern.source, pattern.flags)
.exec(match));
}
let string = "something format_abc",
pattern = /(?:^|\s)format_(.*?)(?:\s|$)/;
let result = searchString(string, pattern);
// [[" format_abc", "abc"], null]
// The trailing `null` disappears if you add the `global` flag
निष्पादक संस्करण (अधिक कोड, कम संश्लिष्ट चीनी)
// Performant ES6/ES2015 syntax
const searchString = (string, pattern) => {
let result = [];
const matches = string.match(new RegExp(pattern.source, pattern.flags));
for (let i = 0; i < matches.length; i++) {
result.push(new RegExp(pattern.source, pattern.flags).exec(matches[i]));
}
return result;
};
// Same thing, but with ES5 syntax
function searchString(string, pattern) {
var result = [];
var matches = string.match(new RegExp(pattern.source, pattern.flags));
for (var i = 0; i < matches.length; i++) {
result.push(new RegExp(pattern.source, pattern.flags).exec(matches[i]));
}
return result;
}
let string = "something format_abc",
pattern = /(?:^|\s)format_(.*?)(?:\s|$)/;
let result = searchString(string, pattern);
// [[" format_abc", "abc"], null]
// The trailing `null` disappears if you add the `global` flag
मुझे अभी तक इन विकल्पों की तुलना अन्य उत्तरों में पहले बताए गए लोगों से करनी है, लेकिन मुझे संदेह है कि यह दृष्टिकोण कम प्रदर्शन करने वाला और दूसरों की तुलना में कम विफल-सुरक्षित है।