「計算出現次數」工具會掃描最多一百萬個字元的已貼上文字,尋找單一字面搜尋字串,並回傳符合的總次數,以及前 100 個以零為起始的位置索引,整個過程在瀏覽器內一次完成。這個規模對「批次」工作來說很重要,因為匯出的記錄檔、抓取的文章封存、合併的 CSV 欄位,以及冗長的逐字稿,很容易就會跨越手動掃描或試算表公式不再實用的大小門檻。由於比對是字面比對而非正規表達式,因此句點就是句點、星號就是星號,搜尋字串中的標點永遠不需要跳脫。在 400 KB 的存取記錄檔中搜尋 user_id=、在合併的程式碼匯出檔中搜尋 TODO,或在 CSV 欄位中搜尋重複的分隔符號,都使用同一套三步驟流程。所有的計數、小寫轉換與位置收集都在頁面本機執行,因此敏感的記錄檔或尚未發布的文件草稿都能在不經任何伺服器上傳的情況下進行計算。

對文字計數器而言「批次」真正的含義
對試算表來說,「批次」通常代表一個有數千個儲存格的欄位。對文字計數工具來說,「批次」的意義不同:它指的是一個被貼上的單一文字區塊,可能長達數百 KB 或數十萬個字元,其中的搜尋字串可能出現數千次。「計算出現次數」就是為第二種定義而設計的。來源欄位最多可接受 1,000,000 個字元,搜尋欄位則最多可接受 1,000 個字元,包括空格、Tab 鍵、貼上的換行、表情符號以及一般的 Unicode 文字。所回報的總次數永遠不會被截斷,因此即使在一百萬字元的逐字稿中有 87,342 筆符合,顯示的主要數字仍會反映每一次命中。只有位置預覽會被限制在前 100 個以零為起始的位移,以避免在結果動輒輸出數萬行時造成頁面無法使用。
在精確的總數與有上限的預覽之間做區隔,是批次設計中最核心的選擇。這代表內容團隊在檢查一年份部落格文章中某個產品名稱出現的頻率時,可以得到精確的百分比計算;而負責檢視 600 KB JavaScript 套件中前幾個 console.log 呼叫位置的程式碼審查者,則能取得一份可點擊跳轉的清單,快速前往前幾筆命中。兩個任務不會互相拖累導致過度渲染。
如何執行批次出現次數計算
- 將來源文字貼上或輸入到主要輸入欄位中。此欄位最多可接受瀏覽器能呈現的任何 Unicode 一百萬字元,包括換行、Tab 鍵和表情符號。
- 在搜尋欄位中輸入要找尋的字面文字。當大小寫很重要時,請選擇區分大小寫的比對;當希望「Error」和「ERROR」算成相同字串時,則選擇不區分大小寫的比對。
- 決定是否符合可以重疊。對於一般的取代作業,請保留預設的「不重疊」模式;若希望計算每一次可能的出現,包括重複的子字串,則開啟「重疊」模式。
- 在結果面板頂端讀取總次數,接著捲動查看列出的位置。前 100 個以零為起始的位移會依序顯示;位於上方的總次數則是精確值。
編輯任一輸入欄位或變更任何選項,都會自動清除先前的輸出,因此舊的計數絕對不會與目前的設定混淆。如果需要在同一份檔案上對多個查詢進行更深層的自動化,同一套確定性邏輯可透過 計算出現次數工具使用,每次都保持相同的字面比對、英文語系小寫轉換以及有上限的預覽行為。
在重疊與不重疊模式之間做選擇
對於批次計數來說,「重疊」開關是最重要的單一決定,因為同一個來源文字中的同一個搜尋字串,會因所選模式不同而產生兩種不同的總數。此工具明確地把兩種解讀都開放出來,而不是自行猜測,因此答案會符合所問的問題。
| 在來源中搜尋 | 模式 | 每次符合後的位移 | 在「aaaa」中搜尋「aa」所回傳的位置 | 總次數 |
|---|---|---|---|---|
| aaaa | 不重疊 | 跳過整個符合長度(2 個單位) | 0, 2 | 2 |
| aaaa | 重疊 | 一個 JavaScript 字串單位 | 0, 1, 2 | 3 |
不重疊模式會在每次命中後,將搜尋位置推進整個符合的搜尋字串長度,這與程式碼中單純的字面取代行為一致。重疊模式則只推進一個 JavaScript 字串單位,這是序列分析時的正確設定——用於計算重複字元的連續區段、DNA 風格字串中的串聯重複,或任何每一個可能起始位移都是有意義觀察值的情境。切換開關會以相同的輸入重新執行計數,因此兩種答案之間的差異永遠只歸因於選項,絕非隱藏的預設值。
區分大小寫,以及英文語系摺疊能做到與不能做到的事
區分大小寫模式會逐位元組比對輸入的字串,因此「Error」和「ERROR」會被視為不同的符合,各自擁有獨立的計數。不區分大小寫模式則會在執行比對之前,使用英文語系的小寫轉換常式同時處理來源文字與搜尋字串,但回報的位移仍對應到原始文字。這在批次處理時很重要:一份以不區分大小寫方式搜尋「fail」的 200 KB 伺服器記錄檔,會回傳原始大小寫位置上的每一個「FAIL」、「Fail」以及「fail」命中。
英文語系的小寫轉換是一種實用的簡化手段,並非完整的排序引擎。超出英文以外的語系特定等價規則、組合型與分解型 Unicode 形式之間的正規化、腔調摺疊,以及特定文字系統的大小寫對應,都不會自動推論。對於一份需要將「é」與「e」視為同一個字母的法文文件,或是一份需要讓「ß」對應到「ss」的德文語料,在貼上之前需要另外進行前置處理。此工具絕不會修改來源文字本身——不會修剪、不會變更行尾符號、不會合併空白字元、也不會移除重複——因此輸入在計數後可以原封不動地重複使用。
當計數達到數百筆時如何閱讀位置清單
一旦次數超過數十筆,位置預覽就會成為結果中最實用的部分。這些位置是以零為起始的 JavaScript 字串位移,代表來源文字的第一個字元是位置 0、第二個字元是位置 1,依此類推。對於大多數一般英文文字而言,一個字元等於一個位移。由代理對(surrogate pair)所表示的字元——許多表情符號、部分罕見的 CJK 字碼點、某些數學符號——在視覺上是一個字元,但佔用了兩個 UTF-16 程式碼單元,這就是為什麼一個表情符號會使後續每個位置編號都偏移一。畫面上顯示的位移是為了瀏覽器與程式設計中可重現的工作而設計,並非使用者所認知的字素(grapheme)索引,這項區別在含有大量表情符號的冗長逐字稿中最為明顯。
顯示 100 筆位置的上限是有意為之:若不設限,一份數十萬筆符合的結果在嘗試渲染時會凍結整個分頁。清單上方的總次數無論上限為何都是精確的,因此百分比計算與總數依然可信。零結果會被視為有效答案,僅顯示無位置,這對像是「這份逐字稿是否真的包含『lambda』一字」的合理性檢查來說是正確的行為。
限制,以及何時該改用其他文字工具
「計算出現次數」的批次設計有一些值得了解的硬性限制。搜尋欄位會拒絕空字串,因為空字串會在來源文字的每一個邊界處觸發符合,並回傳模稜兩可的計數。當搜尋字串比剩餘來源還長時,自然會回傳零。沒有「全字」模式、沒有模糊比對、沒有詞幹提取、沒有萬用字元語法、沒有 Unicode 正規化、沒有取代動作,也沒有檔案上傳解析器——這些都是刻意的設計,因為加入這些功能會在無形中改變「計數」的意義。若要按「字詞」而非按特定字串來計數,請使用 字數計算器 工具。若要變更符合項目而不只是計算它們,尋找並取代文字 採用相同的字面比對模型,並加入了取代步驟。若要在一次作業中對大量字面符合進行批次編輯,這份批次本機文字取代指南 中說明的工作流程,將相同的引擎延伸到了取代作業。若要比較兩段文字,而不是在一段文字中計算某個子字串的次數,那麼基於行的 diff 工具會更合適。
每次執行的運作契約都相同:對於相同的瀏覽器字串輸入與相同的選項設定而言是確定性的,不涉及任何網路呼叫、隨機性、外部資料表,也沒有伺服器狀態。這種確定性,正是讓批次計數能在不同團隊成員之間、跨多次重新執行時都能重現的關鍵,也讓即使畫面上只顯示前 100 個位置時,總次數依然值得信賴。
若想深入了解,請參閱 電子郵件地址尋找器:從已貼上文字在本機擷取。