यह निश्चित रूप से कुछ ऐसा है जिसमें बहुत सारे जाल हैं। मैं पाओलो बेरेगिनो के जवाब के साथ काम कर रहा था, और यह महसूस कर रहा था कि इसकी कुछ सीमाएँ भी हैं। मैंने पाया कि तारीखों के स्ट्रिंग निरूपण के साथ काम करने से कुछ मुख्य समस्याओं का जल्द पता चल जाता है। इस तरह एक इनपुट स्ट्रिंग के साथ शुरू करें:
'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'ध्वज देने की आवश्यकता है, ताकि यह अन्य पदों के सुझावों के समान, केवल पहले एक ही नहीं, बल्कि सभी मैचों को गिना जाए।
मुझे एहसास है कि यह एक बहुत देर से जवाब है, लेकिन यह यहाँ साथ ठोकर खाने वाले किसी के लिए उपयोगी हो सकता है। BTW यहाँ टाइपस्क्रिप्ट संस्करण है:
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;
}