นี่เป็นสิ่งที่มีกับดักมากมายอย่างแน่นอน ฉันกำลังทำงานกับคำตอบของ Paolo Bergantino และตระหนักดีว่าแม้จะมีข้อ จำกัด อยู่บ้าง ฉันพบว่าการใช้การแสดงวันที่แบบสตริงเป็นสถานที่ที่ดีในการค้นหาปัญหาหลัก ๆ เริ่มต้นด้วยสตริงอินพุตดังนี้:
'12-2-2019 5:1:48.670'
และตั้งค่าฟังก์ชันของ Paolo ดังนี้:
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;
}
ฉันต้องการส่งผ่านนิพจน์ทั่วไปเพื่อให้ฟังก์ชันสามารถใช้ซ้ำได้มากขึ้นประการที่สองฉันต้องการให้พารามิเตอร์เป็นสตริงเพื่อที่ไคลเอนต์จะได้ไม่ต้องสร้าง regex แต่เพียงแค่จับคู่กับสตริงเช่น วิธีคลาสยูทิลิตี้สตริงมาตรฐาน
ตอนนี้คุณจะเห็นว่าฉันกำลังจัดการกับปัญหาเกี่ยวกับอินพุต มีดังต่อไปนี้:
if (typeof re !== "string") {
return 0;
}
ฉันกำลังสร้างความมั่นใจว่าการป้อนข้อมูลอะไรที่ไม่เหมือนตัวอักษร0
, false
, undefined
หรือnull
ไม่มีใครที่มีสตริง เนื่องจากลิเทอรัลเหล่านี้ไม่อยู่ในสตริงอินพุตจึงไม่ควรมีการจับคู่ แต่ควรจับคู่'0'
ซึ่งเป็นสตริง
มีดังต่อไปนี้:
re = (re === '.') ? ('\\' + re) : re;
ฉันกำลังจัดการกับความจริงที่ว่าตัวสร้าง RegExp จะ (ฉันคิดว่าผิด) ตีความสตริง'.'
เป็นตัวจับคู่อักขระทั้งหมด\.\
ในที่สุดเนื่องจากฉันใช้ตัวสร้าง RegExp ฉันจึงต้องให้'g'
ค่าสถานะทั่วโลกเพื่อให้นับการจับคู่ทั้งหมดไม่ใช่แค่ตัวแรกเท่านั้นที่คล้ายกับคำแนะนำในโพสต์อื่น ๆ
ฉันตระหนักดีว่านี่เป็นคำตอบที่ช้ามาก แต่อาจเป็นประโยชน์สำหรับใครบางคนที่สะดุดตรงนี้ BTW นี่คือเวอร์ชัน TypeScript:
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;
}