জাভাস্ক্রিপ্টে একটি রেজেক্সের মিলগুলির সংখ্যা গণনা করুন


100

আমি পাঠ্যের একটি অংশে ফাঁকা স্থান / ট্যাব / নিউলাইন সংখ্যা গণনা করার জন্য একটি রেজেেক্স লিখতে চেয়েছিলাম। সুতরাং আমি নির্লজ্জভাবে নিম্নলিখিত লিখেছি: -

numSpaces : function(text) { 
    return text.match(/\s/).length; 
}

কিছু অজানা কারণে এটি সর্বদা ফিরে আসে 1। উপরের বিবৃতিতে সমস্যা কী? আমি তখন থেকে নিম্নলিখিতটি দিয়ে সমস্যার সমাধান করেছি: -

numSpaces : function(text) { 
    return (text.split(/\s/).length -1); 
}

উত্তর:


196

tl; dr: জেনেরিক প্যাটার্ন কাউন্টার

// THIS IS WHAT YOU NEED
const count = (str) => {
  const re = /YOUR_PATTERN_HERE/g
  return ((str || '').match(re) || []).length
}

যারা এখানে পৌঁছেছেন তারা একটি স্ট্রিংয়ে রেজেক্স প্যাটার্নের সংখ্যার সংখ্যা গণনা করার জন্য একটি জেনেরিক উপায় খুঁজছেন এবং শূন্য উপস্থিতিগুলি থাকলে এটি ব্যর্থ হওয়া চান না, এই কোডটি আপনার প্রয়োজন। এখানে একটি বিক্ষোভ:

/*
 *  Example
 */

const count = (str) => {
  const re = /[a-z]{3}/g
  return ((str || '').match(re) || []).length
}

const str1 = 'abc, def, ghi'
const str2 = 'ABC, DEF, GHI'

console.log(`'${str1}' has ${count(str1)} occurrences of pattern '/[a-z]{3}/g'`)
console.log(`'${str2}' has ${count(str2)} occurrences of pattern '/[a-z]{3}/g'`)

আসল উত্তর

আপনার প্রাথমিক কোডটিতে সমস্যা হ'ল আপনি বিশ্বব্যাপী শনাক্তকারীকে মিস করছেন :

>>> 'hi there how are you'.match(/\s/g).length;
4

gরেজেক্সের অংশটি ব্যতীত এটি কেবল প্রথম ঘটনার সাথে মিলবে এবং সেখানে থামবে।

এছাড়াও মনে রাখবেন যে আপনার রেজেক্স একের পর এক ফাঁক স্পেস গণনা করবে:

>>> 'hi  there'.match(/\s/g).length;
2

যদি এটি পছন্দসই না হয় তবে আপনি এটি করতে পারেন:

>>> 'hi  there'.match(/\s+/g).length;
1

5
আপনার ইনপুটটিতে কমপক্ষে একটি স্থান থাকা পর্যন্ত এটি কাজ করে। অন্যথায়, ম্যাচ () বিরক্তিকরভাবে বাতিল হয়ে যায়।
sfink

4
sfink ঠিক আছে, আপনি অবশ্যই ম্যাচ () নালায় ফিরে গেছে কিনা তা পরীক্ষা করে দেখতে চান:var result = text.match(/\s/g); return result ? result.length : 0;
গ্রাস ডাবল

37
আপনি এই ( str.match(...) || [] ).length
নির্মাণটি

11

আমার আগের উত্তরে উল্লিখিত হিসাবে , আপনি RegExp.exec()সমস্ত ম্যাচগুলিতে পুনরাবৃত্তি করতে এবং প্রতিটি ঘটনা গণনা করতে পারেন ; সুবিধাটি কেবল স্মৃতিতে সীমাবদ্ধ, কারণ সামগ্রিকভাবে এটি ব্যবহারের চেয়ে প্রায় 20% ধীর String.match()

var re = /\s/g,
count = 0;

while (re.exec(text) !== null) {
    ++count;
}

return count;



0

এটি অবশ্যই এমন কিছু যা অনেকগুলি ফাঁদে পড়ে। আমি পাওলো বার্গান্টিনোর উত্তর নিয়ে কাজ করছি এবং বুঝতে পেরেছিলাম যে এর কিছু সীমাবদ্ধতা রয়েছে। আমি খেজুরের স্ট্রিং উপস্থাপনাগুলি নিয়ে কাজ করে বেশ কয়েকটি প্রধান সমস্যাটি দ্রুত খুঁজে পেতে একটি ভাল জায়গা পেয়েছি। এটির মতো একটি ইনপুট স্ট্রিং দিয়ে শুরু করুন: '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;
}

-2

কিভাবে এই মত

function isint(str){
    if(str.match(/\d/g).length==str.length){
        return true;
    }
    else {
         return false
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.