TypeScript中的正则表达式:从理论到实践
正则表达式(regex)是处理字符串的强大工具。在TypeScript中,它们不仅能执行搜索、替换和验证,还能提供严格的类型检查,从而在编译阶段减少错误。本文将结合实际案例,讲解如何在TypeScript中使用正则表达式:从邮箱验证到安全的数据提取。
1. 正则表达式的创建与类型化
在TypeScript中,可以通过两种方式创建正则表达式:字面量或RegExp构造函数。推荐使用字面量方式,因为它更简洁且无需转义反斜杠。
// 字面量(推荐方式)const emailRegex: RegExp = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/;
// 构造函数(适用于动态模板)const pattern: string = 'hello';const dynamicRegex: RegExp = new RegExp(pattern, 'gi');
console.log(emailRegex.test('user@example.com')); // trueconsole.log(dynamicRegex.test('Hello, world!')); // true(标志i忽略大小写)注意类型注解: RegExp。TypeScript会自动推断字面量的类型,但显式声明有助于代码文档化。
2. 标志及其类型化
标志用于改变正则表达式的行为。在TypeScript中,标志类型可通过字符串字面量或枚举定义。以下是主要标志:
- g — 全局搜索(不停止在第一个匹配项);
- i — 忽略大小写模式;
- m — 多行模式(^和$作用于每一行);
- s — 点号匹配换行符;
- u — 支持Unicode;
- y — 从上次匹配位置开始搜索(粘性)。
// 通过字符串类型化标志const regexWithFlags: RegExp = /test/gim;
// 检查标志console.log(regexWithFlags.flags); // "gim"console.log(regexWithFlags.global); // trueconsole.log(regexWithFlags.ignoreCase); // trueconsole.log(regexWithFlags.multiline); // true对于动态标志,可使用string类型,但最好通过字面量联合类型限制有效值:
type RegexFlags = 'g' | 'i' | 'm' | 's' | 'u' | 'y';const flags: RegexFlags = 'gi'; // 错误:'gi'不是单个标志// 正确做法:传递字符串const dynamicFlags: string = 'gi';const regex: RegExp = new RegExp('pattern', dynamicFlags);3. RegExp方法与结果类型化
TypeScript中正则表达式的主要方法:
test()— 返回boolean;exec()— 返回RegExpExecArray | null;match()— 字符串方法,返回RegExpMatchArray | null;replace()— 替换匹配项并返回字符串;search()— 返回第一个匹配项的索引或-1。
以下示例使用exec()访问捕获组:
const dateRegex: RegExp = /(\\d{4})-(\\d{2})-(\\d{2})/;const dateStr: string = '今天是2025-03-15';
const match: RegExpExecArray | null = dateRegex.exec(dateStr);
if (match) { const [fullMatch, year, month, day] = match; console.log(`年: ${year}, 月: ${month}, 日: ${day}`); // 输出:年: 2025, 月: 03, 日: 15} else { console.log('未找到日期');}注意:match[0]为完整匹配项,索引1、2、3为捕获组。使用解构赋值时,TypeScript能正确推断类型。