JavaScript: อักขระเกิดขึ้นกี่ครั้งในสตริง?


93

มีวิธีง่ายๆในการตรวจสอบว่าอักขระปรากฏใน String กี่ครั้ง?


4
เป็นไปได้ที่จะซ้ำกันของการนับจำนวนครั้งของอักขระในสตริงใน Javascript
Michael Mrozek

เป็นไปได้ที่จะซ้ำกันของการนับจำนวนครั้งของอักขระในสตริงใน Javascript
opyate

คำตอบ:


82

คุณสามารถลบอักขระอื่น ๆ ในสตริงและตรวจสอบความยาว:

str.replace(/[^a]/g, "").length

นี่มันจะถูกนับว่าหลายas strอยู่ใน


1
เพียงแค่ต้องการชี้ให้เห็นว่าคุณสามารถบันทึกตัวพิมพ์ใหญ่ได้เช่นกันโดยทำ let xLength = str.replace(/[^a || A]/g, "").length;
HappyHands31

@ HappyHands31 คุณหมายถึงlet xLength = str.replace(/[^aA]/g, "").length;
Donald Duck

46

สิ่งนี้นับa ในตัวอย่างด้านล่าง:

str = "A man is as good as his word";
alert(str.split('a').length-1);

หากคุณต้องการไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่คุณต้องการอะไรเช่น

alert(str.split( new RegExp( "a", "gi" ) ).length-1);

ดังนั้นจึงไม่จำเป็นต้องใช้แฟล็ก "A" และ "a" ... "g" แต่คุณต้องใช้แฟล็ก "i"


1
@ Josh มันขึ้นอยู่กับว่าทุกคนชอบอะไร เช่นฉันชอบคำตอบนี้เพราะอ่านง่าย แต่คนอื่นจะชอบคำตอบอื่นเพราะมันมีเทคนิคมากกว่าหรือท้าทายอีกคนจะชอบคำตอบอื่นเพราะมันกินซีพียูน้อยลงไปเรื่อย ๆ .. นั่นคือเหตุผลที่ JavaScript ดีมากรสชาติแห่งอิสระ
vdegenne

21

ใช้ RegEx เพื่อนับจำนวน "a" ในสตริง

var string = 'aajlkjjskdjfAlsj;gkejflksajfjskda';

document.write(string.match(/a/gi).length);

ให้ฉันอธิบายวิธีการทำงาน:

string.matchนี่คือวิธี RegEx ค้นหา RegEx ที่ระบุภายในสตริงที่ระบุ (ในกรณีนี้คือสตริง "string")

(/a/gi)นี่คือ RegEx จริง มันอ่านว่า "ค้นหาอักขระก" มันง่ายมาก นอกจากนี้ยังมีธงสองตัวคือ "g" และ "i" ตัว "g" ระบุว่าให้ค้นหาทั้งหมดที่เกิดขึ้นของอักขระ "a" มิฉะนั้นจะพบเพียงคนแรกและจะไม่นับเลยจากหมายเลขหนึ่ง แฟล็กที่สองคือ "i" ทำให้ RegEx ตรงกับทุกกรณีของอักขระนั้น หากไม่มีแฟล็กนั้น (i) รหัสด้านบนจะนับ 4 เท่านั้นเนื่องจากจะข้ามตัวพิมพ์ใหญ่ "A" ในสตริง เนื่องจากตัว "i" จะจับคู่ตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก ลบ "i" ถ้าคุณต้องการให้ตรงกับตัวพิมพ์เล็ก

string.matchส่งคืนอาร์เรย์ของการจับคู่ทั้งหมดดังนั้นเราจึงใช้lengthเมธอดเพื่อดึงข้อมูลจำนวนรายการอาร์เรย์ ง่ายๆแค่นั้นเอง!


ฉันคิดว่าคุณควรลบ i ออกจาก gi มันเป็นแหล่งที่มาของข้อผิดพลาด คุณสามารถเพิ่มเป็นโบนัสได้ แต่ในกรณีของฉันฉันกำลังมองหาการจับคู่แบบตรงตามตัวพิมพ์เล็กและใหญ่โดยเฉพาะ
Gismo Ranas

2
ปัญหาที่นี่คือว่าถ้าคุณไม่ได้ " a" ในstringแล้วstring.match(/a/gi)เท่ากับและคุณมีข้อผิดพลาดnull Cannot read property 'length' of null
pbialy

1
ส่วน 'gi' มีประโยชน์มากเซอร์ @Drazzah
Jason Sebring

15

ในความคิดของฉันสะดวกและปลอดภัยกว่าที่จะหลีกเลี่ยงนิพจน์ทั่วไปในกรณีนี้

เป็นเพราะถ้าเราต้องการนับอักขระประเภทใดก็ได้เราต้องพิจารณาสองนิพจน์ หนึ่งสำหรับทั่วไปตัวละครและที่สองสำหรับการพิเศษตัวอักษรตัวอย่างเช่น[, ],^และอื่น ๆ มันง่ายที่จะลืมมัน แต่แม้ว่าเราจะจำได้ แต่ฉันคิดว่าเรากำลังขยายโค้ดของเราโดยไม่จำเป็น

ใน กรณีนี้สำหรับสตริงstrและอักขระchใช้วิธีแก้ปัญหาเหล่านี้:

let count = str.split(ch).length - 1

(ขอบคุณ@Sarfraz )

หรือ

let count = str.split('').filter(x => x == ch).length

หรือ

let count = 0
str.split('').forEach(x => x == ch ? count++ : null)

สนุก!



1
var a = "acvbasbb";
var b= {};
for (let i=0;i<a.length;i++){
    if((a.match(new RegExp(a[i], "g"))).length > 1){
        b[a[i]]=(a.match(new RegExp(a[i], "g"))).length;
    }
}
console.log(b);

1
แม้ว่าข้อมูลโค้ดของคุณอาจช่วยแก้ปัญหาได้ แต่คุณควรอธิบายว่าโค้ดของคุณมีจุดประสงค์อะไร (วิธีแก้ปัญหา) นอกจากนี้คุณอาจต้องการตรวจสอบstackoverflow.com/help/how-to-answer
Ahmad F

@AhmadF คุณสามารถใช้สำหรับ> กี่ครั้งที่อักขระเกิดขึ้นในสตริง และเมื่อคุณเรียกใช้สคริปต์นี้คุณจะได้รับวัตถุที่มีคุณสมบัติ (อักขระ) ซึ่งเกิดขึ้นมากกว่าหนึ่งครั้ง
ทิน.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.