Encontrar Em Uma Frase - Sublinhe Os Adjetivos Que Encontrar Em Cada Frase - RETOEDU
Sublinhe Os Adjetivos Que Encontrar Em Cada Frase - RETOEDU

Como encontrar um padrão dentro de uma frase

A gente sempre acha que procurar texto dentro de uma string é simples porque o IDE já tem a função nativa. É, funciona. Até você precisar lidar com algo que não é uma busca cega. Aí a coisa muda de figura. Minha primeira vez que realmente precisei pensar no assunto foi quando estava limpando logs de produção. O problema era encontrar todas as ocorrências de uma palavra específica, mas apenas quando ela aparecia como um termo completo, não como parte de outra palavra. Eu rodava .Contains() ou indexof(), e o resultado vinha cheio de falsos positivos. Palavras como "ativo" encontravam "reativo", "inativo", qualquer merda que tivesse a substring embarcada. Perdi uma tarde inteira nisso.

O workaround foi simples no final: usar expressão regular com delimitadores de palavra, \b. Mas antes eu precisava entender como isso se comporta na prática, porque tem gente que não percebe os detalhes.

Encontrar em uma frase com método certo

O que a maioria das pessoas não considera é que existem pelo menos três camadas diferentes no que significa "encontrar algo em uma frase". A primeira é a busca literal, caractere por caractere. A segunda é a busca com correlação contextual, onde o padrão precisa respeitar limites semânticos. A terceira é a busca fuzzy, que aceita variações ortográficas ou de digitação. Cada uma serve para algo diferente e confundir elas gera bugs que passam direto em teste unitário. Para busca literal, você usa as funções básicas da sua linguagem. indexOf em JavaScript, String.IndexOf em C#, strstr em C. Funciona quando o texto é fixo e exatamente o que está procurando. A limitação óbvia é que não tem flexibilidade nenhuma. Se o texto alvo tiver uma variação, não encontra.

👉 Clique no botão abaixo para saber mais sobre o assunto!

Para o cenário real, onde o texto não é previsível, regex é o caminho. A biblioteca nativa do Python, o módulo re, o preg_match do PHP, o java.util.regex — todas seguem o mesmo padrão POSIX com extensões. O importante é saber montar o padrão corretamente. Usar ^ e $ prende a busca ao início e fim da string inteira. Usar \b delimita palavras. Usar (?=...) faz lookahead positivo sem consumir caracteres. Isso último é o que mais gente estraga porque não entende o que consumo significa nesse contexto. Tive um caso recentemente em que precisei extrair todos os e-mails de um arquivo CSV massivo para um trabalho de higienização de dados. O primeiro rascunho que fiz foi algo como [a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}. Rodou, encontrou 4.712 resultados. Aí eu fiz uma revisão manual em 50 deles e 18 estavam errados. O motivo: o domínio continha caracteres inválidos porque o padrão [a-zA-Z0-9.-] permite pontos e hífens adjacentes, o que não é válido em endereços de domínio reais. Corrigi adicionando uma verificação negativa para sequências de caracteres proibidos e o número de falsos positivos caiu para zero no lote seguinte. Gastei uns 40 minutos a mais no debugging, mas evitou uma limpeza manual que levaria horas.

Outro detalhe que pouca gente leva a sério: performance. Busca por regex em strings muito grandes, especialmente com backtracking exponencial, pode travar a aplicação. Se você está rodando em cima de arquivos de centenas de megabytes, prefere ferramentas como grep ou awk no terminal antes de escrever um script. Ou então, limita o escopo com opções como DOTALL ou VERBOSE dependendo da engine que estiver usando. Aqui vai algo contra-intuitivo: muitas vezes a melhor solução não é regex. Se o objetivo é apenas verificar presença ou extração de campos estruturados, parsers como split, tokenize ou até bibliotecas especializadas como Chomp ou Flex resolvem mais rápido e com menos margem para erro. Regex é poderosa, mas é uma faca suíça. Às vezes você só precisa de uma colher.

Se você está começando agora, meu conselho prático é o seguinte: escreva o padrão primeiro em uma ferramenta de teste visual como regex101.com ou debuggex.com, antes de colocar no código. Depois, testa com casos extremos — string vazia, string com apenas o padrão, string com múltiplas ocorrências sobrepostas, string com caracteres especiais. Isso já elimina a maior parte dos erros que vejo em code review. E se o seu problema for encontrar em uma frase dentro de um contexto de NLP, tipo extração de entidades nomeadas ou análise de sentimento, esquece regex pura. Usa spaCy, NLTK ou transformers. Regex nesse cenário vira manutenção infinita porque linguagem natural não segue regras fixas.