JavaScript >> Javascript 文檔 >  >> Tags >> string

JavaScript:如何計算字符串中子字符串出現的次數

簡介

在處理字符串或大量文本時,您可能會遇到需要計算特定子字符串在另一個字符串中出現的次數的情況。

不過在開始之前,我們先來定義一下什麼是子串。

什麼是子字符串?

一個子字符串 是字符串中明確定義的連續字符序列。例如,如果我們有字符串 "My name is John Doe" ,然後“名字是” 是一個子字符串,但是 "is name" 不是因為它不再是一個連續的序列(我們改變了單詞的順序)。 “是”等單個詞“名字” 總是子字符串。

注意: “你的名字是喬”"My name is John Doe" 的有效子字符串 也是。換句話說,子字符串並不總是完整的單詞,它們的可讀性要差得多。

在 JavaScript 中有很多方法可以實現這一點,但兩個主要方法是 split() 方法正則表達式 .

split()計算字符串中子串的個數 方法

split() 是一種 JavaScript 方法,用於將字符串拆分為子字符串數組,同時保留原始字符串。此方法接受 分隔符 並根據它分離一個字符串。如果沒有提供分隔符,split() 返回一個只有一個元素的數組 - 原始字符串。

注意: 分隔符最明顯的例子可能是 空格 .當您提供它作為 split() 的分隔符時 方法,只要出現空格,原始字符串就會被分割。因此,split() 方法將返回原始字符串中單個單詞的數組。

在本文中,我們將使用一個方便的技巧來獲取字符串中子字符串的出現次數。我們將子字符串設置為 split() 中的分隔符 方法。這樣,我們可以從 split() 的數組中提取子字符串的出現次數 返回方法:

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); // 3

上面的代碼返回 3 ,但 myString 只有一個字符串 "orange" 的實例 .讓我們通過檢查使用 "orange" 拆分原始字符串後創建的數組來檢查發生了什麼 作為分隔符:

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

這會給我們:

['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.']

本質上,split() 方法刪除了所有出現的字符串 "orange" 從原始字符串中提取並在子字符串被刪除的地方對其進行切片。

注意: 請注意這如何應用於字符串 "orange s" - “橙色” 是它的子字符串,因此 split() 刪除 “橙色” 只剩下 "s" .

因為我們發現了三個事件 字符串 "orange" ,原始字符串在三個地方被分割 - 因此我們產生了四個子字符串 .這就是為什麼我們需要減去 1 從數組長度計算子串出現次數時。

這一切都很好,但還有一個橙色 在原始字符串中 - 最後一個單詞是 "Orange" .為什麼我們沒有在前面的例子中計算它?那是因為 split() 方法區分大小寫 ,因此它認為 “橙色”“橙色” 作為不同的元素。

如果您需要讓您的代碼不區分大小寫 ,一個好的解決方案是在檢查出現之前先將整個字符串和子字符串轉換為特定的文本大小寫:

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(); // 4

此外,我們可以做的最後一件事是通過用一個函數包裝我們的代碼來使其可重用:

const countOccurence = (string, word) => {
    let stringLC = string.toLowerCase();
    let wordLC = word.toLowerCase();
    
    let count = stringLC.split(wordLC).length - 1;
    
    return count
};

用正則表達式計算字符串中子串的個數

另一種計算出現次數的方法是使用正則表達式 (正則表達式)。它們是用於搜索、匹配和驗證字符串的字符模式。可能正則表達式最常見的用例是表單驗證 - 檢查字符串是否是(有效的)電子郵件、電話號碼等。但在本文中,我們將使用它來計算字符串中子字符串的出現次數。

首先,我們需要定義一個正則表達式來匹配我們正在尋找的子字符串。假設我們要查找字符串 "orange" 的出現次數 在更大的字符串中,我們的正則表達式將如下所示:

let regex = /orange/gi;

免費電子書:Git Essentials

查看我們的 Git 學習實踐指南,其中包含最佳實踐、行業認可的標準以及隨附的備忘單。停止谷歌搜索 Git 命令並真正學習 它!

在 JavaScript 中,我們在兩個正斜杠之間編寫了一個正則表達式模式 - /pattern/ .可選地,在第二個正斜杠之後,您可以放置​​一個 flags 列表 - 匹配模式時用於替換默認行為的特殊字符。

例如,默認情況下,正則表達式僅匹配搜索字符串中模式的第一次出現。此外,匹配是區分大小寫的,這可能不是我們在搜索子字符串時想要的。因此,我們將介紹兩個將用於本文目的的標誌:

  • g - 確保我們得到所有 模式的出現(不僅僅是第一個)
  • i - 確保匹配不區分大小寫

注意: 根據您的需要,您可以選擇要使用的標誌。這些不是強制性的。

現在,讓我們使用之前創建的正則表達式來計算字符串 "orange" 的出現次數 在 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); // 4

注意: 我們添加了 || [] in 如果沒有匹配則返回一個空數組。因此,出現次數將設置為 0 .

或者,我們可以使用 RegExp() 構造函數來創建正則表達式。它接受一個搜索模式作為第一個參數,並標記為第二個:

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); // 4

此外,我們可以通過將其包裝在一個單獨的函數中來使其可重用:

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

嚴格匹配精確短語

有時,您想匹配一個嚴格的短語或單詞 - 這樣 "oranges" 不包括在您的計數中,或任何包含 "orange" 的單詞中 本身,但不是嚴格的“橙色” .這是在字符串中搜索字符串的更具體用例,幸運的是相當簡單!

let regex = /\Worange\W/gi;

通過將我們的術語包裝在 \W \W 中 , 我們嚴格匹配 "orange" (不區分大小寫)並且這個正則表達式在我們的句子中只會匹配兩次(兩個 "oranges" 不匹配)。

基準性能

當我們使用 JS Benchmark 運行這兩種方法時,split 方法總是比 regex 方法更快,儘管即使對於相當大的文本語料庫,這也不是很明顯。你可能會很好地使用任何一個。

注意: 不要依賴這些基準作為您的最終決定。相反,請自行測試以確定哪一個最適合您的特定用例。

結論

在本文中,我們了解了計算字符串中子字符串出現次數的兩種標準方法。我們還對結果進行了基準測試,並指出只要適合您,您採用哪種方法並不重要。


Tutorial JavaScript 教程
  1. 測試瀏覽器擴展

  2. 你的第一個 React 應用

  3. 如何構建 Telegram OCR 機器人

  4. 在 Ubuntu 上安裝 Node.js 的分步指南

  5. JavaScript 控制台日誌變量 |示例代碼

  6. React Js 中的 Windows 11 💻🌈 更新(非官方)

  7. 引入 Scene.js 庫來創建基於時間軸的動畫

  1. React.js 的最佳 UI 框架

  2. 我最喜歡的 5 個 React Hook 庫

  3. 對於這次採訪,為我構建一個用於 Web 應用程序的自定義 REST-API 路由器

  4. 在 Next.js + Tailwind 中加載和使用 Google 字體的最佳方式

  5. CanJS 3.0 發布

  6. (不是)JavaScript 中的一切都是對象

  7. 銷售重構

  1. Angular中的手繪圖

  2. 使用 Twilio 和 JavaScript 進行 SMS 轉發和響應

  3. 我的第一個瀏覽器擴展現在可用!為 Chrome 和 Firefox 創建新標籤替換的過程

  4. NodeJS - Foal 框架的 2.7 版本在這裡🎉