HOWTO · TypeScript

在 TypeScript 中檢查字串是否具有特定文字

本教程演示瞭如何在 TypeScript 中檢查字串是否包含特定文字。

本頁內容

使用 includes() 可直接檢查 TypeScript 字串是否包含子字串;它會回傳布林值。若還需要符合項目的位置,請使用 indexOf();若條件是正規表示式模式,則可使用 search() 或 RegExp.test()。除非明確地先正規化文字或使用不區分大小寫的模式,否則這些方法都會區分大小寫。

可執行範例使用的 JavaScript 語法同樣適用於 TypeScript,因此可以直接貼到 TypeScript 檔案中,不需要額外設定轉譯工具。

使用 includes() 直接檢查子字串

若要直接取得布林結果,請使用 includes():搜尋的字串包含指定子字串時會回傳 true,否則回傳 false。只需檢查子字串時,這種易讀的布林結果通常是合適的選擇。

若要直接取得布林結果,請在要搜尋的字串上呼叫 includes()。引數就是要比對的文字。

本節中的程式碼以及顯示的標籤或輸出仍為英文。

const message = "TypeScript string search";
const query = "string";
const containsQuery = message.includes(query);

console.log(containsQuery);
true

結果是 true,因為 message 中有完全相同的小寫子字串。例如,改為搜尋 "String" 會回傳 false;includes() 不會變更大小寫,也不會進行符合地區語言習慣的比較。如果資料比對時不應區分大小寫,請先將兩個值正規化,再進行比較,詳見最後一節。

需要符合項目的位置時使用 indexOf()

indexOf() 會在接收字串中搜尋子字串第一次出現的位置,並回傳從零起算的位置。找不到時會回傳 -1。若要將結果轉成布林值,請明確地與 -1 比較:直接在 if 條件中檢查這個數字會忽略位置為 0 的符合項目,因為零會被視為 falsy。

本節中的程式碼以及顯示的標籤或輸出仍為英文。

const message = "TypeScript string search";
const query = "TypeScript";
const position = message.indexOf(query);
const containsQuery = position !== -1;

console.log(position, containsQuery);
0 true

此處第一個字元位於位置零,因此比較結果正確地表示有符合項目。需要標示或截取第一次出現位置附近的內容時,請使用位置;只需確認是否存在時,則使用 includes()。這兩種方法都會比對原始文字,且區分大小寫。這些字串方法會將空搜尋字串視為存在,因此若空白查詢不應算符合項目,請另外驗證使用者輸入。

使用 search() 搜尋正規表示式符合項目

search() 會回傳第一個正規表示式符合項目的位置;找不到時則回傳 -1。傳入 RegExp 值可明確指定模式,如下方範例所示。JavaScript 也會將字串引數轉換成正規表示式,因此傳給 search() 的字串仍會被解讀為模式語法;它不像 includes() 那樣搜尋原始文字。它回傳數字,因此同樣應依照 indexOf() 的規則與 -1 比較。

本節中的程式碼以及顯示的標籤或輸出仍為英文。

const message = "Order 42 is ready";
const position = message.search(/\d+/);

console.log(position);
6

運算式 /\d+/ 會符合一個或多個數字,而 search() 會給出該符合項目的起始位置。例如,以字串形式傳入 "42" 時,它會被轉換成正規表示式,並以模式方式符合這些數字。若只需要判斷模式是否符合,使用 RegExp.test() 會更直接地表達這個意圖。

使用 RegExp.test() 檢查模式

在正規表示式上呼叫 test(),即可取得布林值,表示輸入是否符合模式。若模式是程式碼的一部分,正規表示式字面值是安全且精簡的選擇。正規表示式可以表示字元類別、重複次數和多種選項,而原始子字串搜尋無法表達這些條件。

本節中的程式碼以及顯示的標籤或輸出仍為英文。

const message = "TypeScript string search";
const pattern = /TypeScript/;
const matches = pattern.test(message);

console.log(matches);
true

模式若來自變數,建構 RegExp 時會將 ., * 和 [ 等字元視為模式語法。若變數內容代表原始文字,請先跳脫這些字元:

const userText = "price (USD)";
const escapedText = userText.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
const literalPattern = new RegExp(escapedText);
const found = literalPattern.test("The price (USD) is listed");

console.log(found);
true

如此可避免 userText 中的標點符號改變原本預期的原始文字搜尋。若要反覆使用 test() 做簡單的布林檢查,請避免使用 g 和 y 旗標:這些旗標會讓比對結果受到正規表示式可變的 lastIndex 狀態影響。

處理大小寫敏感度與多個搜尋詞

除非選擇其他比較方式,否則 includes()、indexOf() 和正規表示式都會區分大小寫。若要進行簡單的不區分大小寫子字串比對,請以相同方式正規化兩個字串。toLowerCase() 適用於許多程式識別字和英文文字,但不能一概取代符合地區語言習慣的文字比較。

本節中的程式碼以及顯示的標籤或輸出仍為英文。

const message = "TypeScript makes text checks clear";
const query = "TYPESCRIPT";
const containsQuery = message.toLowerCase().includes(query.toLowerCase());

const candidates = ["JavaScript", "TypeScript", "Python"];
const containsCandidate = candidates.some((item) =>
  message.includes(item)
);

console.log(containsQuery, containsCandidate);
true true

第一個檢查會先正規化兩側,因此不受大小寫影響。some() 呼叫會檢查訊息中是否至少出現一個候選詞,找到符合項目後便停止。若清單中的所有詞都必須出現,請改用 every()。使用這些模式前,請明確決定是否接受空白搜尋詞,因為空子字串會符合所有字串。只需檢查原始文字是否存在時,請選用 includes();需要位置時,請選用 indexOf();需求是模式比對時,則使用 search() 或 RegExp.test()。