Toda equipe tem alguém que reage a “vamos usar IA para isso” com a pergunta
certa: não dá para resolver com uma expressão regular? Na maior parte das vezes,
essa pessoa está certa, e a documentação oficial da TypeSafe está do lado dela.
A lista de coisas a evitar, na página de limites do jev-1.13, abre com esta:
não peça ao modelo algo que o código pode calcular exatamente.
Este comparativo existe para desenhar a fronteira — e para mostrar o desenho em que os dois trabalham juntos, que é o mais útil dos três.
A tarefa
Tirar de um texto livre um valor que o sistema vai usar: um e-mail, um telefone, um valor monetário. Um recibo, uma mensagem de cliente, um documento digitalizado.
O contrato de cada lado
| Expressão regular | Jev (jev-1.13.0) | |
|---|---|---|
| No que se baseia | Forma: o padrão de caracteres | Sentido: o critério que você escreveu |
| Resultado | Determinístico; a mesma entrada dá sempre a mesma saída | Probabilístico, com distribuição e confiança |
| Como se lê a incerteza | Não existe: casou ou não casou | Pela confiança da resposta |
| Custo | Gratuito, local, microssegundos | US$ 0,042 por milhão de tokens de entrada, com saída gratuita |
| Custo de manutenção | Cresce a cada caso de borda adicionado | Uma frase por opção |
| O que falha | Variação não prevista de formato | Julgamento que o critério não descreve |
Onde a regex ganha
Esta seção é curta porque o argumento é forte e não precisa de rodeio.
Quando o padrão é estável, ela é imbatível. CPF, CNPJ, CEP, código de rastreio, número de nota fiscal, placa. Formato fechado, verificação aritmética disponível, resposta exata.
Ela é determinística. Em auditoria, essa propriedade vale mais que
acurácia: você pode reexecutar hoje e daqui a cinco anos com o mesmo resultado,
sem depender de versão de modelo. E aliases de modelo se movem — a página
oficial avisa que jev-latest passa a apontar para a versão nova quando ela
sai.
Ela é gratuita e local. Sem rede, sem chave, sem limite de taxa, sem fornecedor. Em um laço sobre milhões de linhas, isso decide sozinho.
Ela é testável até o fim. Um conjunto de casos cobre o comportamento inteiro. Nenhum modelo probabilístico oferece isso.
Ela conta e compara. Contagem de ocorrências e comparação de datas estão
entre os nove modos de falha declarados do jev-1.13: o modelo não conta de
forma confiável e lê data como texto, não como quantidade ordenada. Isso é
trabalho de código, e está detalhado em
limites do Jev.
Onde o Jev ganha
Quando a pergunta não é sobre a forma. Um recibo tem três e-mails: o do remetente, o do campo de cópia e um citado no corpo como destino do reembolso. A regex acha os três com folga — e não tem como saber qual deles é o certo, porque a resposta está no sentido da frase que cita o terceiro.
Quando “parecido” é a regra. “Esta mensagem é uma reclamação?” não tem padrão de caracteres. Qualquer regex que tente isso vira uma lista de palavras que envelhece em um mês.
Quando o caso de borda é infinito. Toda regex de nome de empresa, endereço ou descrição de produto termina como um monstro com dezoito alternativas e um comentário pedindo desculpas. Um critério escrito em uma frase envelhece melhor.
Quando você precisa saber que não tem certeza. A regex casa ou não casa. O modelo devolve confiança, e a faixa duvidosa pode ir para uma pessoa, como em revisão humana.
O desenho que usa os dois
É o mais importante desta página, e vem da receita oficial de extração de valores pré-processados.
A regex acha os candidatos com folga, aceitando falsos positivos. Uma pergunta de escolha seleciona o trecho certo entre os candidatos encontrados, com uma opção de escape para o caso de nenhum servir. O código copia o trecho escolhido e normaliza.
A propriedade que esse desenho compra é a que mais importa em extração: como o conjunto de respostas possíveis são os próprios trechos achados, o valor devolvido é um deles copiado sem alteração. Não há como inventar valor nem trocar um dígito.
No experimento publicado, com o modelo jev-1.12, o e-mail do recibo saiu como
[email protected] com confiança 0,98, contrariando o endereço do campo
de destinatário por causa do pedido escrito no corpo; o celular
(415) 555-0177 saiu com confiança 1,00 e país US com 0,90, normalizado para
+14155550177; o total de US$ 1.315,50 foi classificado como cobrança com
probabilidade de crédito 0,01, e um valor de US$ 50,00 como crédito com 0,99.
O cookbook também registra os dois limites do desenho: uma pergunta de escolha aceita no máximo 255 opções, então acima disso a seleção vira duas etapas; e achar os candidatos é o trabalho difícil — e-mail, telefone e valor têm regex, nome de pessoa não tem. A receita completa está em extrair valores.
Como escolher
- Se o padrão é fixo e verificável, é regex. Sem discussão, e a documentação oficial concorda.
- Se a decisão depende do sentido da frase, é o modelo.
- Se a regex acha vários candidatos e você precisa do certo, use os dois: a regex gera as opções, o modelo escolhe, o código normaliza.
- Se você está escrevendo a décima alternativa de uma regex, pare: esse é o sinal de que a tarefa virou julgamento.
- Se a saída precisa ser texto novo, nenhum dos dois serve. Vale lembrar que esses modelos de texto escrevem e o Jev só decide.
O índice desta seção fica em comparativos, e a página que reúne todas as fronteiras é quando não usar o Jev.
Perguntas frequentes
Quando a expressão regular é melhor?
Quando o padrão é estável e o acerto é verificável: CPF, CEP, código de rastreio, número de nota fiscal, formato de data fixo. Ela é determinística, gratuita, roda offline e sempre devolve o mesmo resultado. A própria documentação da TypeSafe diz para evitar perguntar ao modelo algo que o código pode calcular exatamente.
Quando a regex não dá conta?
Quando a decisão depende de sentido, não de forma. Qual dos três e-mails encontrados no texto é o do destinatário do reembolso? Este valor é uma cobrança ou um crédito? Nenhuma expressão regular responde a isso, porque a resposta não está no formato do trecho.
Dá para usar os dois juntos?
É o desenho da receita oficial de extração de valores: a regex acha os candidatos com folga, uma pergunta de escolha seleciona o trecho certo entre eles e o código copia e normaliza. Como o modelo só escolhe entre trechos achados, o valor devolvido é um deles copiado sem alteração.
Esse desenho impede o modelo de inventar um valor?
Sim, por construção, e é o ponto principal. O conjunto de respostas possíveis são os próprios trechos que a regex encontrou, mais uma opção de escape. Não há como inventar valor nem trocar um dígito.
Existe limite de candidatos?
Sim: uma pergunta de escolha aceita no máximo 255 opções. Acima disso, a escolha vira duas etapas. O próprio cookbook registra esse limite.