Introdução às expressões regulares em Swift
\n\nExpressões regulares (regex) são uma ferramenta poderosa para buscar, extrair e substituir texto com base em padrões. Em Swift, o trabalho com expressões regulares é implementado através da classe NSRegularExpression do framework Foundation, bem como através de métodos integrados de strings. É uma ferramenta indispensável no desenvolvimento de aplicativos iOS e macOS para validação de formulários, análise de dados, filtragem de texto e muitas outras tarefas.
Neste artigo, exploraremos os principais recursos para trabalhar com expressões regulares em Swift com exemplos práticos. Você aprenderá como criar padrões, realizar buscas, substituições e extração de dados.
\n\nFundamentos do trabalho com NSRegularExpression
\n\nA classe NSRegularExpression é a principal forma de trabalhar com expressões regulares em Swift. Vamos analisar as operações básicas.
Criando uma expressão regular
\n\nimport Foundation\n\nlet pattern = "[A-Za-z]+@[A-Za-z]+\\\\.[A-Za-z]+"\nguard let regex = try? NSRegularExpression(pattern: pattern) else {\n fatalError("Padrão inválido")\n}\n\nObserve a barra invertida dupla \\\\ — em Swift, as strings exigem o escape da barra invertida.
Buscando a primeira correspondência
\n\nlet text = "Entre em contato conosco pelo email: support@example.com"\nlet nsString = text as NSString\nlet range = NSRange(location: 0, length: nsString.length)\n\nif let match = regex.firstMatch(in: text, range: range) {\n let email = nsString.substring(with: match.range)\n print("Email encontrado: \\(email)") // support@example.com\n}\n\nBuscando todas as correspondências
\n\nlet text = "Contatos: info@site.com, admin@site.com, support@site.com"\nlet matches = regex.matches(in: text, range: NSRange(location: 0, length: text.count))\n\nfor match in matches {\n let range = match.range\n let email = (text as NSString).substring(with: range)\n print(email)\n}\n// Saída:\n// info@site.com\n// admin@site.com\n// support@site.com\n\nUsando grupos de captura
\n\nGrupos de captura permitem extrair partes de uma correspondência. Em Swift, os grupos são indicados por parênteses ().
Extraindo dados com grupos
\n\nlet pattern = "(\\\\d{4})-(\\\\d{2})-(\\\\d{2})"\nlet dateString = "Hoje: 2024-03-15"\n\nguard let regex = try? NSRegularExpression(pattern: pattern) else { return }\nlet nsString = dateString as NSString\n\nif let match = regex.firstMatch(in: dateString, range: NSRange(location: 0, length: nsString.length)) {\n let fullDate = nsString.substring(with: match.range) // 2024-03-15\n let year = nsString.substring(with: match.range(at: 1)) // 2024\n let month = nsString.substring(with: match.range(at: 2)) // 03\n let day = nsString.substring(with: match.range(at: 3)) // 15\n \n print("Ano: \\(year), Mês: \\(month), Dia: \\(day)")\n}\n\nGrupos nomeados (trabalhando com Range)
\n\nA partir do Swift 5.7, é possível usar uma sintaxe mais conveniente com Range:
let text = "Preço: 1500 rublos"\nlet pattern = #"(\\d+)\\srublos"#\n\nif let range = text.range(of: pattern, options: .regularExpression) {\n let match = text[range]\n print("Encontrado: \\(match)") // 1500 rublos\n}\n\nSubstituição de texto com expressões regulares
\n\nUm dos recursos mais úteis é a substituição de partes do texto com base em um padrão.
\n\nSubstituição simples
\n\nlet text = "Ligue para o número +7 (123) 456-78-90"\nlet pattern = "\\\\+7\\\\s\\\\(\\\\d{3}\\\\)\\\\s\\\\d{3}-\\\\d{2}-\\\\d{2}"\nlet replacement = "[número oculto]"\n\nguard let regex = try? NSRegularExpression(pattern: pattern) else { return }\nlet modifiedText = regex.stringByReplacingMatches(\n in: text,\n range: NSRange(location: 0, length: text.count),\n withTemplate: replacement\n)\n\nprint(modifiedText) // Ligue para o número [número oculto]\n\n