นับจำนวนการจับคู่ของ 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 แต่แก้ไขให้ทำงานได้จริงในกรณีที่ไม่มีผลลัพธ์
