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.

Joel Cunningham
fonte

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 .

Xenph Yan
fonte
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>

nickf
fonte
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
     });
dnxit
fonte
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/

Nicolas Janel
fonte
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
22
var test = $('#id').attr('value').match(/[^a-z0-9 ]+/);

Aqui está!

Kamil Dąbrowski
fonte
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/.

brook hong
fonte
2
$("input[name='option[colour]'] :checked ")
irfan akhtar
fonte
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']")

Vishnu Prasanth G
fonte
Ú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")')

Prakash GPz
fonte