ค้นหาเว็บไซต์

นับจำนวนการจับคู่ของ regex ใน Javascript


ฉันต้องการเขียน regex เพื่อในการนับจำนวนช่องว่าง/แท็บ/บรรทัดใหม่ในข้อความบางส่วน ดังนั้นฉันก็เขียนสิ่งต่อไปนี้แบบไม่ซับซ้อน:-

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

ด้วยเหตุผลบางอย่างที่ไม่ทราบ มันมักจะส่งค่ากลับเป็น 1 ปัญหาของคำสั่งข้างต้นคืออะไร? ตั้งแต่ตอนนั้นฉันได้แก้ปัญหาด้วยสิ่งต่อไปนี้:-

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

คำตอบ #1

สรุปสั้น: ตัวนับรูปแบบทั่วไป

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

สำหรับผู้ที่มาถึงที่นี่เพื่อหาวิธีทั่วไปในการนับจำนวนครั้งที่เกิดขึ้นของรูปแบบ regex ในสตริง และไม่ต้องการให้ล้มเหลวหากไม่มีการเกิดขึ้นเลย โค้ดนี้คือสิ่งที่คุณต้องการ นี่คือการสาธิต:

/*
 *  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'`)

คำตอบต้นฉบับ

ปัญหากับโค้ดเบื้องต้นของคุณคือคุณขาดตัวระบุแบบ global:

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

หากไม่มีส่วน g ของ regex มันจะจับคู่เฉพาะการปรากฏครั้งแรกและหยุดตรงนั้น

นอกจากนี้ โปรดทราบว่า regex ของคุณจะนับช่องว่างที่ต่อเนื่องกันสองครั้ง:

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

ถ้านั่นไม่ต้องการ คุณสามารถทำสิ่งนี้ได้:

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

คำตอบ #2

ดังที่ได้กล่าวไว้ในคำตอบก่อนหน้านี้ คุณสามารถใช้ RegExp.exec() เพื่อวนซ้ำผ่านการจับคู่ทั้งหมดและนับแต่ละกรณี; ข้อดีจำกัดเพียงเรื่องหน่วยความจำเท่านั้น เพราะโดยรวมแล้ว มันช้ากว่าการใช้ String.match() ประมาณ 20%

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

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

return count;

คำตอบ #3

(('a a a').match(/b/g) || []).length; // 0
(('a a a').match(/a/g) || []).length; // 3

อิงจาก https://stackoverflow.com/a/48195124/16777 แต่แก้ไขให้ทำงานได้จริงในกรณีที่ไม่มีผลลัพธ์

บทความที่เกี่ยวข้อง