Expressões Regulares em Swift: do básico aos exemplos avançados
Expressões regulares (regex) são uma ferramenta poderosa para trabalhar com texto, permitindo buscar, substituir e validar strings com padrões complexos. Em Swift para iOS e macOS, o trabalho com regex é implementado através da classe NSRegularExpression do framework Foundation. Neste artigo, vamos abordar todos os aspectos principais: desde a criação de padrões simples até o processamento de resultados e otimização de performance.
O artigo será útil tanto para iniciantes que estão conhecendo Swift, quanto para desenvolvedores experientes que desejam aprofundar seus conhecimentos sobre manipulação de texto em aplicativos iOS/macOS.
1. Fundamentos do trabalho com NSRegularExpression
A classe NSRegularExpression é a principal ferramenta para trabalhar com expressões regulares em Swift. Ela fornece métodos para busca, substituição e extração de dados de strings.
1.1. Criando uma expressão regular
Para criar um objeto NSRegularExpression, usa-se um inicializador que recebe uma string com o padrão e flags opcionais (NSRegularExpression.Options). A construção é envolvida em try, pois pode lançar um erro se a sintaxe do padrão for inválida.
import Foundation
let pattern = "\\\\d{3}-\\\\d{2}-\\\\d{4}" // Exemplo: 123-45-6789do { let regex = try NSRegularExpression(pattern: pattern, options: []) print("Expressão regular criada com sucesso")} catch { print("Erro na sintaxe da expressão regular: \\(error.localizedDescription)")}1.2. Opções principais (NSRegularExpression.Options)
As opções permitem alterar o comportamento da expressão regular. Aqui estão as mais usadas:
.caseInsensitive— ignorar diferença entre maiúsculas e minúsculas (A = a)..allowCommentsAndWhitespace— ignorar espaços e comentários no padrão..dotMatchesLineSeparators— o ponto (.) também corresponde a caracteres de quebra de linha..anchorsMatchLines— os caracteres ^ e $ correspondem ao início e fim de cada linha, não da string inteira.
Exemplo com a opção .caseInsensitive:
let pattern = "hello"let regex = try NSRegularExpression(pattern: pattern, options: .caseInsensitive)let testString = "Hello, World!"let range = NSRange(location: 0, length: testString.utf16.count)if regex.firstMatch(in: testString, options: [], range: range) != nil { print("Correspondência encontrada") // Exibe: Correspondência encontrada}2. Busca de correspondências e trabalho com resultados
Após criar a expressão regular, é possível realizar buscas de correspondências na string. Para isso, usam-se os métodos firstMatch e matches.
2.1. Buscando a primeira correspondência
O método firstMatch(in:options:range:) retorna a primeira correspondência encontrada como um objeto NSTextCheckingResult (ou nil, se nada for encontrado).
let text = "Meu número: 123-45-6789, e também 987-65-4321"let pattern = "\\\\d{3}-\\\\d{2}-\\\\d{4}"let regex = try NSRegularExpression(pattern: pattern, options: [])let range = NSRange(location: 0, length: text.utf16.count)
if let match = regex.firstMatch(in: text, options: [], range: range) { let matchedString = (text as NSString).substring(with: match.range) print("Primeira correspondência: \\(matchedString)") // 123-45-6789}2.2. Buscando todas as correspondências
O método matches(in:options:range:) retorna um array com todas as correspondências. Isso é útil quando é necessário processar cada ocorrência do padrão.
let text = "Códigos: ABC-123, DEF-456, GHI-789"let pattern = "[A-Z]{3}-\\\\d{3}"let regex = try NSRegularExpression(pattern: pattern, options: [])let range = NSRange(location: 0, length: text.utf16.count)let matches = regex.matches(in: tex