Logo Zephyrnet

JavaScript: Cách đếm số chuỗi con xuất hiện trong một chuỗi

Ngày:

Giới thiệu

Khi làm việc với các chuỗi hoặc một lượng lớn văn bản, có thể bạn sẽ gặp phải các tình huống mà bạn cần đếm số lần một chuỗi con cụ thể đã xảy ra trong một chuỗi khác.

Trong bài viết này, chúng ta sẽ xem xét cách sử dụng JavaScript để đếm số lần xuất hiện của chuỗi con trong một chuỗi. Chúng tôi sẽ xem xét các cách tiếp cận và phương pháp khác nhau để có được con số đó.

Nhưng trước khi bắt đầu, trước tiên chúng ta hãy xác định chuỗi con là gì.

Chuỗi con là gì?

A chuỗi con là một chuỗi các ký tự liên tiếp được xác định rõ ràng trong một chuỗi. Ví dụ, nếu chúng ta có chuỗi "Tên tôi là John Doe", sau đó "tên là" là một chuỗi con, nhưng "là tên" không phải vì nó không còn là một chuỗi liên tiếp nữa (chúng tôi đã thay đổi thứ tự của các từ). Các từ riêng lẻ chẳng hạn như "Là""Tên" luôn luôn là các chuỗi con.

Lưu ý: "Tên y là Jo" là một chuỗi con hợp lệ của "Tên tôi là John Doe" cũng. Nói cách khác, chuỗi con không phải lúc nào cũng là toàn bộ từ, chúng có thể khó đọc hơn nhiều.

Có nhiều cách để thực hiện điều này trong JavaScript, nhưng hai phương pháp chính là split() phương phápbiểu thức chính quy.

Đếm số chuỗi con trong chuỗi với tách () Phương pháp

Sản phẩm split() là một phương pháp JavaScript để tách chuỗi thành một mảng chuỗi con trong khi vẫn giữ nguyên chuỗi ban đầu. Phương thức này chấp nhận một phân cách và tách một chuỗi dựa trên nó. Nếu không có dấu phân tách nào được cung cấp, split() trả về một mảng chỉ có một phần tử - chuỗi ban đầu.

Lưu ý: Có lẽ ví dụ rõ ràng nhất về dấu phân cách là không gian trống. Khi bạn cung cấp nó như một dấu phân cách cho split() , chuỗi gốc sẽ được chia nhỏ bất cứ khi nào xuất hiện khoảng trống. Do đó, split() phương thức sẽ trả về một mảng các từ riêng lẻ từ chuỗi ban đầu.

Trong bài viết này, chúng tôi sẽ sử dụng một thủ thuật hữu ích để lấy số lần xuất hiện của một chuỗi con trong một chuỗi. Chúng tôi sẽ đặt chuỗi con làm dấu phân cách trong split() phương pháp. Bằng cách đó, chúng ta có thể trích xuất số lần xuất hiện của chuỗi con từ mảng mà split() phương thức trả về:

let myString = "John Doe has 5 oranges while Jane Doe has only 2 oranges, Jane gave Mike 1 of her orange so she is now left with only 1 Orange.";
let mySubString = "orange";

let count = myString.split(mySubString).length - 1;
console.log(count);

Mã trên đã trả lại 3, nhưng myString chỉ có một trường hợp của chuỗi "quả cam". Hãy kiểm tra xem điều gì đã xảy ra bằng cách kiểm tra mảng được tạo sau khi chúng ta đã tách chuỗi ban đầu với "quả cam" làm dấu phân cách:

console.log(myString.split(mySubString));

Điều này sẽ cung cấp cho chúng tôi:

['John Doe has 5 ', 's which Jane Doe has only 2 ', 's, Jane gave Mike 1 of her ', ' so she is now left with only 1 Orange.']

Về cơ bản, split() phương thức đã loại bỏ tất cả các lần xuất hiện của chuỗi "quả cam" từ chuỗi ban đầu và cắt nó ở những nơi mà chuỗi con đã được loại bỏ.

Lưu ý: Lưu ý cách áp dụng cho chuỗi "trái camS" - các "quả cam" là chuỗi con của nó, do đó, split() Loại bỏ "quả cam" và chỉ để lại cho chúng tôi "S".

Vì chúng tôi đã tìm thấy ba lần xuất hiện của chuỗi "quả cam", chuỗi ban đầu được cắt ở ba nơi - do đó chúng tôi đã sản xuất bốn chuỗi con. Đó là lý do tại sao chúng ta cần trừ 1 từ độ dài mảng khi ta tính số lần xuất hiện của chuỗi con.

Đó là tất cả tốt, nhưng còn một trái cam trong chuỗi gốc - từ cuối cùng là "Trái cam". Tại sao chúng ta chưa tính nó trong ví dụ trước? Đó là bởi vì split() phương pháp là trường hợp nhạy cảm, do đó nó xem xét "quả cam""Trái cam" như các phần tử khác nhau.

Nếu bạn cần tạo mã của mình trường hợp không nhạy cảm, một giải pháp tốt trước tiên sẽ là chuyển đổi toàn bộ chuỗi và chuỗi con thành một trường hợp văn bản cụ thể trước khi kiểm tra các lần xuất hiện:

let myString = "John Doe has 5 oranges while Jane Doe has only 2 oranges, Jane gave Mike 1 of her orange so she is now left with only 1 Orange.";
let mySubString = "ORANGE";

let myStringLC = myString.toLowerCase();
let mySubStringLC = mySubString.toLowerCase();

let count = myStringLC.split(mySubStringLC).length - 1;
console.log();

Ngoài ra, điều cuối cùng chúng ta có thể làm là làm cho mã của chúng ta có thể tái sử dụng bằng cách gói nó bằng một hàm:

const countOccurence = (string, word) => {
    let stringLC = string.toLowerCase();
    let wordLC = word.toLowerCase();

    let count = stringLC.split(wordLC).length - 1;

    return count
};

Đếm số chuỗi con trong chuỗi với RegEx

Một phương pháp khác để đếm số lần xuất hiện là sử dụng biểu thức chính quy (RegEx). Chúng là các mẫu ký tự được sử dụng để tìm kiếm, đối sánh và xác nhận các chuỗi. Có lẽ trường hợp sử dụng phổ biến nhất cho cụm từ thông dụng là xác nhận hình thức - kiểm tra xem chuỗi có phải là email (hợp lệ), số điện thoại, v.v. Nhưng trong bài viết này, chúng tôi sẽ sử dụng nó để đếm số lần xuất hiện của một chuỗi con trong một chuỗi.

Nếu bạn muốn biết thêm về biểu thức chính quy trong JavaScript, bạn nên đọc hướng dẫn toàn diện của chúng tôi - “Hướng dẫn về Biểu thức chính quy và Chuỗi đối sánh trong JavaScript”.

Trước hết, chúng ta cần xác định một biểu thức chính quy sẽ khớp với chuỗi con mà chúng ta đang tìm kiếm. Giả sử chúng ta muốn tìm số lần xuất hiện của chuỗi "quả cam" trong một chuỗi lớn hơn, biểu thức chính quy của chúng ta sẽ trông như sau:

let regex = /orange/gi;

Xem hướng dẫn thực hành, thực tế của chúng tôi để học Git, với các phương pháp hay nhất, các tiêu chuẩn được ngành công nghiệp chấp nhận và bảng lừa đảo đi kèm. Dừng lệnh Googling Git và thực sự học nó!

Trong JavaScript, chúng tôi viết một mẫu biểu thức chính quy giữa hai dấu gạch chéo về phía trước - /pattern/. Theo tùy chọn, sau dấu gạch chéo thứ hai, bạn có thể đặt một danh sách cờ - các ký tự đặc biệt được sử dụng để thay thế hành vi mặc định khi khớp các mẫu.

Ví dụ: theo mặc định, biểu thức chính quy chỉ khớp với lần xuất hiện đầu tiên của mẫu trong chuỗi tìm kiếm. Ngoài ra, đối sánh có phân biệt chữ hoa chữ thường, có thể không phải là điều chúng ta muốn khi tìm kiếm chuỗi con. Do đó, chúng tôi sẽ giới thiệu hai cờ mà chúng tôi sẽ sử dụng cho mục đích của bài viết này:

  • g - đảm bảo rằng chúng tôi nhận được tất cả các lần xuất hiện của mẫu (không chỉ lần đầu tiên)
  • i - đảm bảo rằng sự phù hợp là trường hợp không nhạy cảm

Lưu ý: Dựa trên nhu cầu của bạn, bạn có thể chọn loại cờ bạn sẽ sử dụng. Đây không phải là bắt buộc.

Bây giờ, hãy sử dụng một biểu thức chính quy đã tạo trước đó để đếm số lần xuất hiện của chuỗi "quả cam" trong myString:

let myString = "John Doe has 5 oranges while Jane Doe has only 2 oranges, Jane gave Mike 1 of her orange so she is now left with only 1 Orange.";

let regex = /orange/gi;
let count = (myString.match(regex) || []).length;

console.log(count);

Lưu ý: Chúng tôi đã thêm || [] trả về một mảng trống nếu không có kết quả phù hợp. Do đó, số lần xuất hiện sẽ được đặt thành 0.

Ngoài ra, chúng ta có thể sử dụng RegExp() hàm tạo để tạo một biểu thức chính quy. Nó chấp nhận một mẫu tìm kiếm làm đối số đầu tiên và gắn cờ là đối số thứ hai:

let myString = "John Doe has 5 oranges while Jane Doe has only 2 oranges, Jane gave Mike 1 of her orange so she is now left with only 1 Orange.";

let regex = new RegExp("orange", "gi");
let count = (myString.match(regex) || []).length;

console.log(count);

Ngoài ra, chúng ta có thể làm cho cái này có thể tái sử dụng bằng cách gói nó trong một hàm riêng:

let countOcurrences = (str, word) => {
	var regex = new RegExp(word, "gi");
	let count = (str.match(regex) || []).length;
	return count;
};

Các cụm từ đối sánh chính xác nghiêm ngặt

Đôi khi, bạn muốn đối sánh với một cụm từ hoặc từ nghiêm ngặt - để "những quả cam" không được bao gồm trong số lượng của bạn hoặc bất kỳ từ nào bao gồm "quả cam" tự nó, nhưng không hoàn toàn "quả cam". Đây là một trường hợp sử dụng cụ thể hơn để tìm kiếm các chuỗi trong các chuỗi, và may mắn thay là khá dễ dàng!

let regex = /WorangeW/gi;

Bằng cách gói thời hạn của chúng tôi trong W W, chúng tôi đang đối sánh chặt chẽ với "quả cam" (không phân biệt chữ hoa chữ thường) và regex này sẽ chỉ khớp hai lần trong câu của chúng ta (cả hai "những quả cam" không khớp).

Hiệu suất đo điểm chuẩn

Khi chúng tôi chạy cả hai phương pháp bằng cách sử dụng Điểm chuẩn JS, phương thức phân tách sẽ luôn ra đời nhanh hơn phương pháp regex, mặc dù điều này không thực sự đáng chú ý ngay cả đối với kho ngữ liệu văn bản khá lớn. Bạn có thể sẽ ổn khi sử dụng một trong hai.

Lưu ý: Đừng dựa vào những điểm chuẩn này là quyết định cuối cùng của bạn. Thay vào đó, hãy tự mình kiểm tra chúng để xác định cái nào là phù hợp nhất cho trường hợp sử dụng cụ thể của bạn.

Kết luận

Trong bài viết này, chúng ta đã tìm hiểu về hai phương pháp tiêu chuẩn để tính số lần xuất hiện của chuỗi con trong một chuỗi. Chúng tôi cũng đánh giá kết quả, lưu ý rằng bạn thực hiện cách tiếp cận nào không quan trọng miễn là nó phù hợp với bạn.

tại chỗ_img

Tin tức mới nhất

tại chỗ_img