Expressões Regulares em Swift: guia completo para iniciantes
Expressões regulares (regex) são uma ferramenta poderosa para buscar, substituir e validar dados textuais. Em Swift, o trabalho com expressões regulares é implementado através da classe NSRegularExpression do framework Foundation. Neste artigo, você aprenderá a criar e aplicar expressões regulares em aplicativos para iOS e macOS, analisará exemplos reais e dominará os fundamentos da sintaxe.
1. Fundamentos da sintaxe de expressões regulares
Antes de escrever código em Swift, é importante entender os símbolos e construções básicas do regex. Aqui estão os elementos-chave:
.— qualquer caractere (exceto quebra de linha)*— 0 ou mais repetições do caractere anterior+— 1 ou mais repetições?— 0 ou 1 repetição (torna o caractere anterior opcional)\\d— qualquer dígito (0-9)\\w— qualquer letra, dígito ou sublinhado[abc]— um dos caracteres a, b ou c[^abc]— qualquer caractere exceto a, b, c^— início da string$— fim da string
Esses símbolos são combinados para criar padrões. Por exemplo, o padrão ^[A-Za-z]+$ significa: a string consiste apenas em letras do alfabeto latino do início ao fim.
2. Criando e usando NSRegularExpression em Swift
Em Swift, o trabalho com regex começa com a importação do Foundation e a criação de uma instância de NSRegularExpression. Vamos considerar um exemplo simples: buscar todos os dígitos em uma string.
import Foundation
let text = "Meu número: 123-456-7890"let pattern = "\\\\d+" // padrão: um ou mais dígitos
do { let regex = try NSRegularExpression(pattern: pattern) let results = regex.matches(in: text, range: NSRange(text.startIndex..., in: text)) for match in results { if let range = Range(match.range, in: text) { print("Encontrado: \\(text[range])") } }} catch { print("Erro na expressão regular: \\(error.localizedDescription)")}// Saída:// Encontrado: 123// Encontrado: 456// Encontrado: 7890Observe o escape da barra invertida: na string Swift "\\\\d" corresponde à expressão regular \\d. A classe NSRegularExpression lança uma exceção para padrões inválidos, por isso usamos try-catch.
2.1. Trabalhando com NSRange
O método matches(in:range:) retorna um array de objetos NSTextCheckingResult. Cada resultado contém um intervalo (NSRange) da correspondência encontrada. Para converter para Swift Range, use o inicializador Range(match.range, in: text).
3. Exemplos práticos de expressões regulares
Vamos considerar três tarefas típicas: validação de email, extração de URL e substituição de texto.
3.1. Validação de endereço de email
Vamos verificar se a string corresponde a um padrão simples de email (versão simplificada):
func isValidEmail(_ email: String) -> Bool { let pattern = "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,}$" let regex = try? NSRegularExpression(pattern: pattern) let range = NSRange(location: 0, length: email.utf16.count) return regex?.firstMatch(in: email, range: range) != nil}
print(isValidEmail("test@example.com")) // trueprint(isValidEmail("invalid-email")) // falseAqui usamos firstMatch, que retorna a primeira correspondência. Se não houver correspondências, retorna nil.
3.2. Extraindo URLs do texto
Suponha que temos uma string com vários links. Vamos extrair todas as URLs:
let text = "Visite o site https://pythonlib.ru ou escreva para support@pythonlib.ru"let pattern = "https?://[\\\\w./%-]+"
do