Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Regex funciona diferente do código sem Regex

Olá

o exemplo sem expressão regular não fica exatamente igual ao com Regex, como seria o código para que ele busque dentro das palavras também, assim como o Regex faz?

Ex.: com regex quando eu digito "au" ele encontra o "Paulo", porém sem o regex eu tenho que digitar o "p" para ele encontrar o "Paulo", ou seja, ele não busca dentro da palavra.

Sei que tem a ver com o número zero configurado no substr, que ele inicia a busca do índice 0... como fazer pra ele buscar do 0 até os outros para que funcione como o Regex?

5 respostas

Opa Samuel, esse tipo de match é um pouco complexo. Isso por que você vai precisar fazer o seguinte.

  1. Conferir quantos caracteres foram digitados.
  2. Varrer a string em groups de caracteres que sejam do mesmo tamanho da quantidade digitada.
  3. Ir pulando de caractere em caractere formando cada um dos grupos.

Sendo assim, se digitar, au, e tivermos paulo. Teremos as seguintes iterações no lado.

pa, au, ul, lo

Como fazer esses grupos? No lado teremos um contador e no substr, teremos a posição final contando a posição atual + 1. Vejamos:

let palavra = "paulo";
let busca = "au";

palavra.split("").forEach((letra, indice) => {
    if(palavra.substr(indice, (indice + 1)) == busca){
        console.log("Achei!");
        console.log(palavra.substr(indice, (indice + 1)), "no indice: " + indice);
    }
});

Note que meu exemplo não está considerando o tamanho da busca pra formar os grupos. Topa o desafio de melhorar esse código?

Olá Wanderson, desculpa a demora, estava terminando o curso para ter mais alguma ideia de como fazer...

eu consegui usando um pouco do seu exemplo, mas nao sei se é a melhor forma, essa foi a única que eu consegui com os conhecimentos que eu adquiri aqui, talvez você possa me ajudar a melhorar esse código que já está funcional.

Mais uma pergunta: o que significa o LET que você usou no lugar de VAR?

campoFiltro.addEventListener("input", function(){
    var pacientes = document.querySelectorAll(".paciente");

    if(this.value.length > 0) {
        for(var i = 0; i < pacientes.length; i++){
            var paciente = pacientes[i];

            var palavra = paciente.querySelector(".info-nome").textContent.toLowerCase();

            var busca = this.value.toLowerCase();
            //adiciona invisivel e testa abaixo
            paciente.classList.add("invisivel");

            //se tiver a string buscada remove a classe
            palavra.split("").forEach((letra,indice) => {
                if(palavra.substr(indice,busca.length) == busca){
                    paciente.classList.remove("invisivel");
                }
            });
        }
    }else{
        for (var i = 0; i < pacientes.length; i++) {
            var paciente = pacientes[i];
            paciente.classList.remove("invisivel");
        }
    }
});
solução!

Opa Samuel, pra uma primeira ideia, sua solução está ótima! Você pode sim melhorar este código, mas não vejo por que fazer isso agora. Eu me preocuparia em fazer de uma outra forma, usando regex, expressão regular, temos um curso aqui na Alura.

Uma expressão regular, pode substituir todo esse trecho de código:

palavra.split("").forEach((letra,indice) => {
                if(palavra.substr(indice,busca.length) == busca){
                    paciente.classList.remove("invisivel");
                }
});

Quer dizer, não exatamente todo, mas pode melhorar muito o código.


Sobre o let, é a "nova" forma de declarar variáveis no JavaScript. O var é do ES5, a partir do ES6 usamos let ou const. Essas são coisas que você vai aprender nos cursos avançados de JavaScript I, II e III.

Perfeito, obrigado pela força :)

Samuel, problema resolvido? Marca o post que resolve sua dúvida como solução do tópico tá bom?