এটি অবশ্যই এমন কিছু যা অনেকগুলি ফাঁদে পড়ে। আমি পাওলো বার্গান্টিনোর উত্তর নিয়ে কাজ করছি এবং বুঝতে পেরেছিলাম যে এর কিছু সীমাবদ্ধতা রয়েছে। আমি খেজুরের স্ট্রিং উপস্থাপনাগুলি নিয়ে কাজ করে বেশ কয়েকটি প্রধান সমস্যাটি দ্রুত খুঁজে পেতে একটি ভাল জায়গা পেয়েছি। এটির মতো একটি ইনপুট স্ট্রিং দিয়ে শুরু করুন:
'12-2-2019 5:1:48.670'
এবং পাওলো এর ফাংশনটি এভাবে সেট আপ করুন:
function count(re, str) {
if (typeof re !== "string") {
return 0;
}
re = (re === '.') ? ('\\' + re) : re;
var cre = new RegExp(re, 'g');
return ((str || '').match(cre) || []).length;
}
আমি চাইছিলাম যে নিয়মিত এক্সপ্রেশনটি পাস করা হোক, যাতে ফাংশনটি আরও পুনরায় ব্যবহারযোগ্য হয়, দ্বিতীয়ত, আমি প্যারামিটারটি একটি স্ট্রিং হতে চেয়েছিলাম, যাতে ক্লায়েন্টকে পুনরায় তৈরি করতে না হয়, তবে কেবল স্ট্রিংয়ের সাথে মেলে, যেমন একটি স্ট্যান্ডার্ড স্ট্রিং ইউটিলিটি ক্লাস পদ্ধতি।
এখন, আপনি এখানে দেখতে পারেন যে আমি ইনপুট দিয়ে সমস্যাগুলি নিয়ে কাজ করছি। নিম্নলিখিত সহ:
if (typeof re !== "string") {
return 0;
}
আমি যে ইনপুট আক্ষরিক মত কিছু নয় নিশ্চিত করছি 0, false, undefined, অথবা null, এর কোনওটিই স্ট্রিং হয়। যেহেতু এই আক্ষরিকগুলি ইনপুট স্ট্রিংটিতে নেই, কোনও মিল থাকতে হবে না, তবে এটি মিলবে '0', যা একটি স্ট্রিং।
নিম্নলিখিত সহ:
re = (re === '.') ? ('\\' + re) : re;
আমি এই বিষয়টি নিয়ে কাজ করছি যে RegExp কনস্ট্রাক্টর স্ট্রিংটিকে '.'সমস্ত চরিত্রের ম্যাচার হিসাবে ব্যাখ্যা করবে (আমার ধারণা, ভুলভাবে)\.\
অবশেষে, কারণ আমি RegExp কনস্ট্রাক্টর ব্যবহার করছি, আমার এটিকে বিশ্বব্যাপী 'g'পতাকাটি দেওয়া দরকার যাতে এটি অন্যান্য পোস্টের পরামর্শের মতো, কেবল প্রথমটি নয়, সমস্ত ম্যাচ গণনা করে।
আমি বুঝতে পেরেছি যে এটি একটি চূড়ান্ত উত্তর, তবে এটি এখানে কেউ হোঁচট খাওয়ার পক্ষে সহায়ক হতে পারে। বিটিডাব্লু এখানে টাইপস্ক্রিপ্ট সংস্করণ:
function count(re: string, str: string): number {
if (typeof re !== 'string') {
return 0;
}
re = (re === '.') ? ('\\' + re) : re;
const cre = new RegExp(re, 'g');
return ((str || '').match(cre) || []).length;
}