এই উত্তরে ব্যবহৃত পরিভাষা:
- ম্যাচ তাই মত আপনার স্ট্রিং বিরুদ্ধে আপনার Regex প্যাটার্ন চলমান ফলাফল থেকে বোঝা যায়:
someString.match(regexPattern)
।
- মিলিত নিদর্শনগুলি ইনপুট স্ট্রিংয়ের সমস্ত মিলিত অংশগুলি নির্দেশ করে, যা সব মিলিয়ে অ্যারের অভ্যন্তরে থাকে। ইনপুট স্ট্রিংয়ের অভ্যন্তরে এটি আপনার প্যাটার্নের সমস্ত উদাহরণ।
- মিলিত গোষ্ঠীগুলি রেগেক্স প্যাটার্নে সংজ্ঞায়িত, সমস্ত গ্রুপকে ধরার জন্য নির্দেশ করে। (প্রথম বন্ধনীর অভ্যন্তরের নিদর্শনগুলি
/format_(.*?)/g
, যেখানে (.*?)
এটি একটি মিলিত গোষ্ঠী হবে)) এটি মিলিত নিদর্শনগুলির মধ্যেই থাকে ।
বিবরণ
ম্যাচ করা গোষ্ঠীগুলিতে অ্যাক্সেস পেতে , প্রতিটি মিলিত প্যাটার্নগুলিতে আপনার ম্যাচটি পুনরাবৃত্তি করার মতো কোনও ফাংশন বা কিছু দরকার । অন্যান্য উত্তরগুলির মতো দেখা যায়, আপনি এটি করতে পারেন এমন অনেকগুলি উপায় রয়েছে। অন্যান্য বেশিরভাগ উত্তর সমস্ত মিলিত প্যাটার্নগুলিতে পুনরাবৃত্তি করতে কিছুক্ষণ লুপ ব্যবহার করে তবে আমি মনে করি যে আমরা সকলেই সেই পদ্ধতির সাথে সম্ভাব্য বিপদগুলি জানি। এটি new RegExp()
কেবলমাত্র প্যাটার্নের পরিবর্তে কোনওটির সাথে ম্যাচ করা প্রয়োজন , যা কেবলমাত্র একটি মন্তব্যে উল্লিখিত হয়েছিল। এর কারণ .exec()
পদ্ধতিটি একটি জেনারেটরের ফাংশনের অনুরূপ আচরণ করে - এটি প্রতিবার কোনও ম্যাচ হওয়ার পরে থামায় , তবে .lastIndex
পরের .exec()
কলটিতে সেখান থেকে চালিয়ে যেতে থাকে ।
কোড উদাহরণ
নীচে একটি ফাংশনের উদাহরণ searchString
যা Array
সমস্ত মিলিত নিদর্শনগুলির একটি প্রদান করে , যেখানে প্রতিটিmatch
সমন্বিত Array
সমস্ত মিলিত গোষ্ঠীগুলির সাথে একটি । কিছুক্ষণ লুপ ব্যবহার না করে আমি উভয় Array.prototype.map()
ফাংশন এবং আরও পারফরম্যান্স উপায়ে ব্যবহার করেছি - একটি সরল- for
লুপ ব্যবহার করে ।
সংক্ষিপ্ত সংস্করণ (কম কোড, আরও সিনট্যাকটিক চিনি)
এগুলি কম সম্পাদনযোগ্য যেহেতু তারা মূলত একটি প্রয়োগ করে implement 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
আমি অন্যান্য বিকল্পগুলির পূর্বে উল্লিখিতগুলির সাথে এই বিকল্পগুলির তুলনা করতে পারি, তবে আমি সন্দেহ করি যে এই পদ্ধতিটি অন্যদের তুলনায় কম পারফরম্যান্ট এবং কম ব্যর্থ-নিরাপদ।