Expressões Regulares em TypeScript: da Teoria à Prática
Expressões regulares (regex) são uma ferramenta poderosa para trabalhar com strings. Em TypeScript, elas não apenas permitem realizar busca, substituição e validação, mas também fornecem tipagem estrita, o que reduz a quantidade de erros em tempo de compilação. Neste artigo, vamos explorar como usar expressões regulares em TypeScript com exemplos reais: desde a validação de email até a extração segura de dados.
1. Criação e Tipagem de Expressões Regulares
Em TypeScript, uma expressão regular pode ser criada de duas formas: usando um literal ou o construtor RegExp. A primeira forma é preferível, pois é mais curta e não requer escape de barras invertidas.
// Literal (forma recomendada)const emailRegex: RegExp = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/;
// Construtor (útil para padrões dinâmicos)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 (flag i ignora maiúsculas/minúsculas)Observe a anotação de tipo : RegExp. O TypeScript infere automaticamente o tipo para literais, mas a indicação explícita ajuda a documentar o código.
2. Flags e sua Tipagem
As flags alteram o comportamento da expressão regular. Em TypeScript, o tipo das flags pode ser definido por um literal de string ou enumeração. Vamos considerar as principais flags:
- g — busca global (não para após a primeira correspondência);
- i — modo insensível a maiúsculas/minúsculas;
- m — modo multilinha (^ e $ funcionam para cada linha);
- s — o ponto corresponde ao caractere de nova linha;
- u — suporte a Unicode;
- y — busca a partir da última posição encontrada (sticky).
// Tipagem de flags via stringconst regexWithFlags: RegExp = /test/gim;
// Verificação de flagsconsole.log(regexWithFlags.flags); // "gim"console.log(regexWithFlags.global); // trueconsole.log(regexWithFlags.ignoreCase); // trueconsole.log(regexWithFlags.multiline); // truePara flags dinâmicas, use o tipo string, mas é melhor restringi-lo a valores permitidos usando uma união de literais:
type RegexFlags = 'g' | 'i' | 'm' | 's' | 'u' | 'y';const flags: RegexFlags = 'gi'; // Erro: 'gi' não é uma flag individual// Correto: passar uma stringconst dynamicFlags: string = 'gi';const regex: RegExp = new RegExp('pattern', dynamicFlags);3. Métodos RegExp e Tipagem de Resultados
Os principais métodos para trabalhar com expressões regulares em TypeScript:
test()— retornaboolean;exec()— retornaRegExpExecArray | null;match()— método da string, retornaRegExpMatchArray | null;replace()— substitui correspondências e retorna uma string;search()— retorna o índice da primeira correspondência ou -1.
Vamos considerar um exemplo com exec(), que dá acesso aos grupos de captura:
const dateRegex: RegExp = /(\\d{4})-(\\d{2})-(\\d{2})/;const dateStr: string = 'Hoje é 2025-03-15';
const match: RegExpExecArray | null = dateRegex.exec(dateStr);
if (match) { const [fullMatch, year, month, day] = match; console.log(`Ano: ${year}, Mês: ${month}, Dia: ${day}`); // Saída: Ano: 2025, Mês: 03, Dia: 15} else { console.log('Data não encontrada');}Observe: match[0] é a correspondência completa, e os índices 1, 2, 3 são os grupos de captura. O TypeScript infere corretamente os tipos ao usar desestruturação.