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

Existe um limite para o Regex?

Estou fazendo um projeto que tem uma lista bastante extensa que funciona normalmente, tanto a adição de novos itens como a busca. A partir de um determinado item da lista a busca pelo regex para de funcionar. Se eu excluo o último que funciona e adiciono outro, funciona. Mas se adiciono outro item após a posição do último, para de funcionar a busca a partir desse item. O regex tem um limite para o tamanho da lista?

18 respostas

Victor, tudo bom?

A princípio não existe um limite, até mesmo pq no fim é uma comparação entre padrão e string que você faz. Caso possa, compartilhe o código aqui para que possamos analisar. Caso seja inviável compartilhar tenta fazer um exemplo onde esse mesmo problema aparece.

Boa tarde Ronald, tudo bom e você? Primeiramente obrigado pela rapidez na resposta, segue o código abaixo, a partir do Renault Duster o Regex para de funcionar.

<div class="carro">
                    <p class="info-nome">fortaleza volkswagen gol 2013 fortaleza gol 2013</p>
                    <a href="http://www.jmveiculos.net.br/carro_ver.php?id=3055#ver_galeria" target="_blank"><img class="foto-carro" src="jm-veiculos/gol.jpg" alt="volkswagen gol" class="media-object  img-responsive img-thumbnail">
                </div>

                <div class="carro">
                    <p class="info-nome">fortaleza fiat grand siena 2017 fortaleza grand siena 2017 fortaleza siena 2017</p>
                    <a href="http://www.jmveiculos.net.br/carro_ver.php?id=4094#ver_galeria" target="_blank"><img class="foto-carro" src="jm-veiculos/siena.jpg" alt="fiat grand siena" class="media-object  img-responsive img-thumbnail">

                <div class="carro">
                    <p class="info-nome">fortaleza renault duster 2019 fortaleza duster 2019</p>
                    <a href="http://www.jmveiculos.net.br/carro_ver.php?id=4843#ver_galeria" target="_blank"><img class="foto-carro" src="jm-veiculos/duster.jpg" alt="renault duster" class="media-object  img-responsive img-thumbnail">

                <div class="carro">
                    <p class="info-nome">fortaleza toyota corolla 2011 fortaleza corolla 2011</p>
                    <a href="http://www.jmveiculos.net.br/carro_ver.php?id=1927#ver_galeria" target="_blank"><img class="foto-carro" src="jm-veiculos/corolla.jpg" alt="toyota corolla" class="media-object  img-responsive img-thumbnail">

Boa, na verdade precisamos do código da Regex. Se ele está dentro de um laço, etc. Ter os dados ajuda, mas não são tantos assim para travar.

Certo... segue o código. Mas eu só peguei um trecho do html, tem umas 500 divs como essas no código.

var campoFiltro = document.querySelector("#filtrar-carros");

campoFiltro.addEventListener("input", function() {

 var carros = document.querySelectorAll(".carro");

    if (this.value.length > 0) {
        for (var i = 0; i < carros.length; i++) {
            var carro = carros[i];    
            var tdNome = carro.querySelector(".info-nome");
            var nome = tdNome.textContent;
            var expressao = new RegExp(this.value, "i"); //esse "i" é para ativar case insensitive

            if (expressao.test(nome)) {
                carro.classList.remove("invisivel");
            } else {
                carro.classList.add("invisivel");
            }

        }
    } else {
        for (var i = 0; i < carros.length; i++) {
            var carro = carros[i];
            carro.classList.remove("invisivel");
        }
    }
});

Troca:

i < carros.length;

Por:

i <= carros.length;

Infelizmente não deu certo. Se eu busco por "Fortaleza" aparecem todos os carros de Fortaleza inclusive o Renault Duster, mas se eu buscar "Fortaleza Renault Duster" ele não aparece.

Estranho, aqui foi. Segue o código:

<meta charset="utf-8">

<div class="carro">
                    <p class="info-nome">fortaleza volkswagen gol 2013 fortaleza gol 2013</p>
                    <a href="http://www.jmveiculos.net.br/carro_ver.php?id=3055#ver_galeria" target="_blank"><img class="foto-carro" src="jm-veiculos/gol.jpg" alt="volkswagen gol" class="media-object  img-responsive img-thumbnail">
                </div>

                <div class="carro">
                    <p class="info-nome">fortaleza fiat grand siena 2017 fortaleza grand siena 2017 fortaleza siena 2017</p>
                    <a href="http://www.jmveiculos.net.br/carro_ver.php?id=4094#ver_galeria" target="_blank"><img class="foto-carro" src="jm-veiculos/siena.jpg" alt="fiat grand siena" class="media-object  img-responsive img-thumbnail">

                <div class="carro">
                    <p class="info-nome">fortaleza renault duster 2019 fortaleza duster 2019</p>
                    <a href="http://www.jmveiculos.net.br/carro_ver.php?id=4843#ver_galeria" target="_blank"><img class="foto-carro" src="jm-veiculos/duster.jpg" alt="renault duster" class="media-object  img-responsive img-thumbnail">

                <div class="carro">
                    <p class="info-nome">fortaleza toyota corolla 2011 fortaleza corolla 2011</p>
                    <a href="http://www.jmveiculos.net.br/carro_ver.php?id=1927#ver_galeria" target="_blank"><img class="foto-carro" src="jm-veiculos/corolla.jpg" alt="toyota corolla" class="media-object  img-responsive img-thumbnail">

<script>

    var campoFiltro = document.querySelector("#filtrar-carros");

campoFiltro.addEventListener("input", function() {

 var carros = document.querySelectorAll(".carro");

    if (this.value.length > 0) {
        for (var i = 0; i <= carros.length; i++) {
            var carro = carros[i];    
            var tdNome = carro.querySelector(".info-nome");
            var nome = tdNome.textContent;
            var expressao = new RegExp(this.value, "i"); //esse "i" é para ativar case insensitive

            if (expressao.test(nome)) {
                carro.classList.remove("invisivel");
            } else {
                carro.classList.add("invisivel");
            }

        }
    } else {
        for (var i = 0; i <= carros.length; i++) {
            var carro = carros[i];
            carro.classList.remove("invisivel");
        }
    }
});
</script>

Resultado:

fortaleza volkswagen gol 2013 fortaleza gol 2013

volkswagen gol
fortaleza fiat grand siena 2017 fortaleza grand siena 2017 fortaleza siena 2017

fiat grand siena
fortaleza renault duster 2019 fortaleza duster 2019

renault duster
fortaleza toyota corolla 2011 fortaleza corolla 2011

toyota corolla

Pois é, por isso perguntei se tinha algum limite, por que tenho muitos carros cadastrados e partir de um determinado ponto para de funcionar sem ter o código alterado. Como alternativa a este filtro estou querendo filtrar por marca, modelo e ano do carro. Você teria alguma dica de como posso fazer isso?

No meu exemplo a lista corre do primeiro ao último. Esse não seria o problema. Agora desmembrar você poderia pegar os itens entre números (anos) e depois pegar os itens entre espaços (modelo e montadora). Mas os dados estão bem chatos para separar.

Blz, obrigado.

Fala ai Victor, tudo bem? Conseguiu resolver seu problema? Vi que o tópico está sem resposta ha alguns dias e não foi solucionado.

Fico no aguardo.

Opa, tudo bem Matheus? Infelizmente não consegui resolver.

Consegue compartilhar o projeto completo? Pode compartilhar através do Github ou Google Drive (zipado).

Assim eu consigo simular o problema por aqui e analisá-lo com mais calma.

Fico no aguardo.

segue o link com o projeto completo, obrigado!

Fala Victor, tudo bem? Testei aqui seu projeto e funcionou certinho.

Consegui fazer várias buscas de carro, listou os resultados, quando limpa a busca ele volta todos, tudo como eu acredito que deveria funcionar.

Espero ter ajudado.

solução!

Opa, blz Matheus? Consegui resolver o problema, tinha uma div que não estava fechada . Muito obrigado pela a atenção e desculpe o transtorno.

Boa Victor, fico feliz que tenha resolvido o problema.

Sempre que precisar não deixe de criar suas dúvidas.

Abraços e bons estudos.