1
resposta

[Dúvida] Find / Regex - Desconsiderando caracteres especiais

Boa tarde.

Referente ao find, foi proposto o seguinte:

if (name) find.name = { $regex: name, $options: "i" };

Porém, minha dúvida fica em relação ao nome, por exemplo, no Bando de Dados está cadastrado nome Guilherme Magalhães.

Se a busca vier como magalhães, consigo localizar,** caso venha como magalhaes, o moongose não vai encontrar**.

Como poderíamos atribuir isso à busca?

Grato.

1 resposta

Oi, Gustavo, tudo bem?

Como os nomes já estão guardados no banco de dados com caracteres especiais, eu desconheço uma solução que consiga fazer esse tipo de busca. Isso porque seria necessário que o código conseguisse relacionar qualquer vogal aos seus correspondentes com acentos, e regexs não possuem uma solução nativa para isso. O que regexs conseguem fazer, por exemplo, é relacionar letras maiúsculas às suas correspondentes minúsculas, e vice-versa, utilizando a flag i.

Contudo, existe uma solução para uma "situação inversa". Se o nome do autor vier como "Magalhães" pela busca, conseguimos transformar os caracteres especiais para seus correspondentes não especiais (podemos chamar esse processo de normalização, que também significa padronização). Podemos utilizar um código como o abaixo:

const str = "Magalhães";
const strNormalizada = str.normalize("NFD").replace(/\p{Diacritic}/gu, "");

console.log(strNormalizada); // Magalhaes

Essa resposta do stack overflow explica em detalhes como esse código funciona.

Dessa forma, caso haja uma situação onde você não quer que haja distinção entre caracteres especiais e os não especiais, você já deve salvar os nomes no banco de dados sem os caracteres especiais. Ou seja, ao cadastrar um novo nome, você poderia usar um código como o acima para salvar o nome normalizado (assim, o nome já ficaria salvo como "Magalhaes" no banco de dados).

Em seguida, ao realizar uma busca, você aplicaria o código acima novamente ao receber o dado de busca. Assim, se for passado "Magalhães", a string será normalizada para não possuir caracteres especiais (ficando "Magalhaes") e a correspondência do banco de dados será encontrada.

Espero ter ajudado! Abraços e bons estudos :)

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software