Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Regex incorreta ou inadequada

Minha intenção era buscar no "banco" pelos nomes que estão formatados corretamente, isto é, primeira letra maiúscula (podendo ser uma maiúscula acentuada) e todo o resto da palavra sendo composta minúscula (podendo ser minúsculas acentuadas). Ou seja, palavras como "LuCAS ..." e "ChicÔ" não deveriam ser contempladas pela RegEx. Mas o que de fato está acontecendo é que a palavra "ChicÔ" por exemplo ainda está sendo contemplada pela RegEx (ou pelo menos parte dela está) e, na saída do console, está sendo impresso "Chic".

Eu até já entendi o problema: A classe "[a-zà-ú]+", devido ao sinal de mais "+" no final, está aceitando um ou mais** de determinado elemento (nesse caso minúsculas acentuadas ou não), ou seja, podendo aceitar apenas uma parte da string e ignorar o restante, igual aconteceu com "ChicÔ" para que fosse impresso apenas "Chic".

Assim, ainda não consegui cumprir com meu propósito de exibir apenas os nomes com formatação correta, visto que não dá pra considerar que está correto o nome "Francisco Chic" (que surgiu a partir de "Francisco ChicÔ"), porque ele está incompleto.

const fs = require('fs')
const db = fs.readFileSync('database.csv', "utf-8")

const regexNome = /([A-ZÀ-Ú][a-zà-ú]+)(\s[A-ZÀ-Ú][a-zà-ú]+)+/g

const matchRegex = db.match(regexNome)

console.log(matchRegex)
1 resposta
solução!

Oi Lucas! Tudo certo?

A sua regex está quase lá, mas precisa de alguns ajustes para garantir que ela só capture nomes corretamente formatados, ou seja, com a primeira letra maiúscula (incluindo acentuadas) e o restante minúsculo (também incluindo acentuadas).

A questão que você mencionou sobre a regex capturar "Chic" de "ChicÔ" ocorre porque a parte [a-zà-ú]+ permite capturar qualquer sequência de letras minúsculas, mas não impede que a palavra termine com uma letra maiúscula ou acentuada incorretamente.

Para corrigir isso, você pode ajustar a regex para garantir que a palavra inteira siga o padrão desejado. Aqui está uma sugestão de como você pode fazer isso:

const regexNome = /\b[A-ZÀ-Ú][a-zà-ú]*\b(?:\s[A-ZÀ-Ú][a-zà-ú]*)*/g;

Explicando a regex:

  • \b: Define uma borda de palavra, garantindo que o padrão comece e termine em uma palavra completa.
  • [A-ZÀ-Ú]: Captura a primeira letra maiúscula, incluindo acentuadas.
  • [a-zà-ú]*: Captura zero ou mais letras minúsculas, incluindo acentuadas.
  • (?:\s[A-ZÀ-Ú][a-zà-ú]*)*: Captura espaços seguidos por palavras que começam com uma letra maiúscula e continuam com minúsculas, repetindo esse padrão para múltiplos nomes.

Esse padrão deve ajudar a garantir que apenas nomes formatados corretamente sejam capturados. Lembre-se de testar com diferentes entradas para garantir que a regex está funcionando como esperado.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.