জাভাস্ক্রিপ্টে দুটি স্ট্রিংয়ের মধ্যে স্ট্রিং পেতে নিয়মিত প্রকাশ
সর্বাধিক সম্পূর্ণ সমাধান যা বেশিরভাগ ক্ষেত্রে কাজ করবে তা হ'ল একটি অলস বিন্দু মিলে যাওয়ার প্যাটার্ন সহ একটি ক্যাপচারিং গ্রুপ ব্যবহার করা । যাইহোক, একটি বিন্দু জাভাস্ক্রিপ্ট Regex লাইন বিরতি অক্ষর মেলে না, তাই, কি 100% ক্ষেত্রেই কাজ করবে একটি হল বা / / নির্মান।.
[^]
[\s\S]
[\d\D]
[\w\W]
ECMAScript 2018 এবং আরও নতুন সামঞ্জস্যপূর্ণ সমাধান
ইসকামাস্ক্রিপ্ট 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/0 বা আরও শ্বেতস্থান)।
দৃশ্য 1: একক লাইন ইনপুট
এই এবং নীচের সমস্ত অন্যান্য পরিস্থিতিতে সমস্ত জাভাস্ক্রিপ্ট পরিবেশ দ্বারা সমর্থিত। উত্তরের নীচে ব্যবহারের উদাহরণগুলি দেখুন।
cow (.*?) milk
cow
প্রথমে পাওয়া যাবে, তারপরে একটি স্পেস, তারপরে লাইন ব্রেক ব্রেক ছাড়া অন্য যে কোনও 0+ অক্ষর, *?
অলস কোয়ান্টিফায়ার হিসাবে যত কম সম্ভব , তাকে গ্রুপ 1 এ বন্দী করা হবে এবং তারপরে একটি স্থান milk
অবশ্যই অনুসরণ করবে (এবং সেগুলি মিলে যায় এবং গ্রাসও হয়) )।
দৃশ্য 2: একাধিক ইনপুট
cow ([\s\S]*?) milk
এখানে, cow
এবং একটি স্পেসটি প্রথমে মিলিত হয়, তারপরে যত কম 0+ অক্ষর মিলে যায় এবং তাদের গ্রুপ 1 এ ক্যাপচার করা হয়, এবং তার সাথে একটি স্পেস milk
মেলাতে হয়।
দৃশ্য 3: ওভারল্যাপিং ম্যাচগুলি
তোমার মত একটি স্ট্রিং থাকে >>>15 text>>>67 text2>>>
এবং আপনি 2 ম্যাচ পেতে প্রয়োজন মধ্যবর্তী >>>
+ + number
+ + whitespace
এবং >>>
, আপনি ব্যবহার করতে পারবেন না />>>\d+\s(.*?)>>>/g
আসলে কারণে এই হিসাবে শুধুমাত্র 1 টি মিল পাবেন >>>
আগে 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
দেখুন Regex ডেমো (হতে পারে যদি \r\n
, ব্যবহার /cow\r?\n(.*(?:\r?\n(?!milk$).*)*)\r?\nmilk/gm
)। এই ছোট পরীক্ষার স্ট্রিংয়ের সাথে, পারফরম্যান্স লাভটি নগণ্য, তবে খুব বড় পাঠ্যের সাহায্যে আপনি পার্থক্যটি অনুভব করবেন (বিশেষত যদি লাইন দীর্ঘ হয় এবং লাইন বিরতি খুব বেশি না হয়)।
জাভাস্ক্রিপ্টে নমুনা রেগেক্স ব্যবহার:
//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]));