Expressões regulares do seletor jQuery


580

Estou após a documentação sobre o uso de curingas ou expressões regulares (não tenho certeza da terminologia exata) com um seletor jQuery.

Eu mesmo procurei por isso, mas não consegui encontrar informações sobre a sintaxe e como usá-lo. Alguém sabe onde está a documentação para a sintaxe?

EDIT: Os filtros de atributo permitem selecionar com base nos padrões de um valor de atributo.

Respostas:


340

James Padolsey criou um filtro maravilhoso que permite que o regex seja usado para a seleção.

Digamos que você tenha o seguinte div:

<div class="asdf">

O :regexfiltro de Padolsey pode selecioná-lo da seguinte forma:

$("div:regex(class, .*sd.*)")

Além disso, verifique a documentação oficial dos seletores .


3
Está bem. Estive lá, mas realmente não sabia o nome do que estava procurando. Eu tive outro olhar e usando filtros de atributo é o que eu estava procurando.
Joel Cunningham

O seletor regex da @padolsey funciona muito bem. Aqui está um exemplo em que você pode iterar sobre campos de entrada de texto, arquivo e caixa de seleção ou áreas de texto com ele: $ j ('input: regex (tipo, texto | arquivo | caixa de seleção), textarea'). Each (function (index) {// ...});
Matt Setter

13
A resposta abaixo do nickf deve ser a aceita. Se você estiver lendo esta resposta, não deixe de ler essa!
Quentin Skousen

5
Estou recebendo erro: erro de sintaxe, expressão não reconhecida: pseudo: regex não suportado
ryan2johnson9

2
-1. O código para implementar isso não está incluído na resposta e é suscetível à podridão do link. Além disso, eu encontrei dois erros ao testar o código - ele eliminará vírgulas das expressões regulares que os contêm (resolvidas substituindo matchParams.join('')por matchParams.join(',')) e qualquer padrão que corresponda 'undefined'ou 'null'corresponda undefinede null, respectivamente. Este segundo bug pode ser resolvido verificando se o valor testado !== undefinede !== nullprimeiro. De qualquer maneira, passar uma função .filter()é mais fácil e parece mais limpo / mais legível para mim.
James T

732

Você pode usar a filterfunção para aplicar uma correspondência de regex mais complicada.

Aqui está um exemplo que corresponderia apenas aos três primeiros divs:

$('div')
  .filter(function() {
    return this.id.match(/abc+d/);
  })
  .html("Matched!");
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div id="abcd">Not matched</div>
<div id="abccd">Not matched</div>
<div id="abcccd">Not matched</div>
<div id="abd">Not matched</div>


como usar variáveis ​​no local da correspondência (/ abc + d /); ?
precisa saber é o seguinte

2
@Sasivarnakumar a resposta para esta pergunta é aqui
Felipe Maia

283

Isso pode ser útil.

Se você encontrar por Contains , será assim

    $("input[id*='DiscountType']").each(function (i, el) {
         //It'll be an array of elements
     });

Se você encontrar pela Starts With , será assim

    $("input[id^='DiscountType']").each(function (i, el) {
         //It'll be an array of elements
     });

Se você encontrar pelo Ends With , será assim

     $("input[id$='DiscountType']").each(function (i, el) {
         //It'll be an array of elements
     });

Se você deseja selecionar elementos cujo id não é uma determinada string

    $("input[id!='DiscountType']").each(function (i, el) {
         //It'll be an array of elements
     });

Se você deseja selecionar elementos cujo nome contenha uma determinada palavra, delimitada por espaços

     $("input[name~='DiscountType']").each(function (i, el) {
         //It'll be an array of elements
     });

Se você deseja selecionar elementos cujo id é igual a uma determinada sequência ou começa com essa sequência seguida por um hífen

     $("input[id|='DiscountType']").each(function (i, el) {
         //It'll be an array of elements
     });

3
Ótima resposta, mas ids, sendo identificadores, não pode conter um espaço , o ~=exemplo deve ser alterado para outra coisa, como class, que é uma lista de identificadores delimitados por espaço em branco. Coisas como classsão para o que o ~=seletor de atributos foi planejado.
Código inútil

49

Se o uso da expressão regular for limitado para testar se um atributo começa com uma determinada sequência, você pode usar o ^seletor JQuery.

Por exemplo, se você deseja selecionar apenas div com o ID começando com "abc", você pode usar:

$("div[id^='abc']")

Muitos seletores muito úteis para evitar o uso de regex podem ser encontrados aqui: http://api.jquery.com/category/selectors/attribute-selectors/


isso não funcionará para requisitos de correspondências que não diferenciam maiúsculas de minúsculas. A função .filter atende melhor a essas necessidades.
brainondev

2
isso foi bom para mim, eu só queria ver se havia um '__destroy' no final de um ID de entrada, então eu usei *=assim:$("input[id*='__destroy'][value='true']")
ryan2johnson9


8

Adicione uma função jQuery,

(function($){
    $.fn.regex = function(pattern, fn, fn_a){
        var fn = fn || $.fn.text;
        return this.filter(function() {
            return pattern.test(fn.apply($(this), fn_a));
        });
    };
})(jQuery);

Então,

$('span').regex(/Sent/)

selecionará todos os elementos de amplitude com correspondências de texto / Enviado /.

$('span').regex(/tooltip.year/, $.fn.attr, ['class'])

selecionará todos os elementos de span com suas classes match /tooltip.year/.




2

Estou apenas dando o meu exemplo em tempo real:

No javascript nativo, usei o seguinte snippet para encontrar os elementos com ids iniciados com "select2-qownerName_select-result".

document.querySelectorAll("[id^='select2-qownerName_select-result']");

Quando passamos de javascript para jQuery, substituímos o trecho acima pelo seguinte, que envolve menos alterações de código sem perturbar a lógica.

$("[id^='select2-qownerName_select-result']")


Única opção que encontrei sem jQuery, e mais eficiente. Obrigado!
ggonmar 24/03

1

Se você quiser apenas selecionar elementos que contenham uma determinada sequência, use o seguinte seletor:

$(':contains("search string")')

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.