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 的匹配,因为零是假值。
本节中的代码以及显示的标签或输出仍为英文。
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()。