Регулярные выражения Javascript с jQuery содержат расширение Regex - PullRequest
7 голосов
/ 18 января 2012

Я использую расширение для jQuery " содержит ", как показано ниже:

$.extend($.expr[':'],{
    containsExact: function(a,i,m){
        return $.trim(a.innerHTML.toLowerCase()) === m[3].toLowerCase();
    },
    containsExactCase: function(a,i,m){
        return $.trim(a.innerHTML) === m[3];
    },
    containsRegex: function(a,i,m){
        var regreg =  /^\/((?:\\\/|[^\/])+)\/([mig]{0,3})$/,
        reg = regreg.exec(m[3]);
        return RegExp(reg[1], reg[2]).test($.trim(a.innerHTML));
    }
});

У меня есть таблица с определенными ячейками, которые я пытаюсь условно отформатировать, поэтомуЯ использую расширение в селекторе td с функцией containsRegex.Проблема, с которой я сталкиваюсь, заключается в том, что многие из регулярных выражений, которые я пытаюсь использовать (которые я тестировал на тестерах регулярных выражений javascript, таких как this , и они работали), не работаютс этой функцией.Вот различные строки, которые я хотел бы сопоставить:

Обратите внимание, что «x» может быть ax, t, f или v, а «X» может быть X, T, Fили V. Наконец, «(mb)» может быть любыми двумя строчными буквами az в скобках.

-, (mb), x *, x * (mb), x, x (mb), X *, X * (mb), X

А вот код с несколькими операторами регулярных выражений, которые я использую:

 $("td:containsExact('-')").addClass("0 queue"); // -
 $("td:containsRegex('/[^xtfv*]\([a-z]{2}\)/g')").addClass("1 active"); // (mb)
 $("td:containsRegex('/\b[xtfv]\*(?!\()/g')").addClass("2 queue review"); // x*
 $("td:containsRegex('/\b[xtfv]\*(?:\([a-z]{2}\))/g')").addClass("3 active review"); // x*(mb)
 $("td:containsRegEx('/\b[xtfv](?![*\(])/g')").addClass("4 queue");  // x
 $("td:containsRegEx('/\b[xtfv](?:\([a-z]{2}\))/g')").addClass("5 active");  // x(mb)
 $("td:containsRegEx('/\b[XTFV]\*(?!\()/g')").addClass("6 queue review");  // X*
 $("td:containsRegEx('/\b[XTFV]\*(?:\([a-z]{2}\))/g')").addClass("7 active review");  // X*(mb)
 $("td:containsRegEx('/\b[XTFV](?![*\(])/g')").addClass("8 done");  // X

Большинство из них проходят ошибки в Chrome.У кого-нибудь есть указатели?Ограничение содержимого каким-либо образом ограничено?

Заранее спасибо за помощь!

Ответы [ 2 ]

5 голосов
/ 19 января 2012

Хорошо, я думаю, что понял ... Вот изменения, которые я сделал:

  • Нижние пять селекторов имеют заглавную букву "E" и должны быть все "содержитRegex ()"
  • Я немного изменил containsRegex, добавив в возвращаемую проверку "reg", чтобы сделать его более надежным:

    containsRegex: function(a,i,m){
      var regreg =  /^\/((?:\\\/|[^\/])+)\/([mig]{0,3})$/,
       reg = regreg.exec(m[3]);
      return reg ? RegExp(reg[1], reg[2]).test($.trim(a.innerHTML)) : false;
    }
    
  • Все экранированные символы врегулярное выражение должно быть двойным (то есть \( должно быть \\()

  • Я удалил все одинарные кавычки, чтобы фактически помочь мне отвлечься

  • Я удалил номера классов.Я знаю, что ID не должны начинаться с цифр, и я почти уверен, что имена классов не должны начинаться или должны быть только цифрами.В любом случае, это привело к тому, что некоторые селекторы добавили одно и то же регулярное выражение (то есть «x» и «-» выглядят одинаково, а также «x * (mb)» и «X * (mb)» с css в демоверсии).

В любом случае, я обновлю свою суть с помощью этого кода и вашей демонстрации :

/* jQuery selector to match exact text inside an element
*  :containsExact()     - case insensitive
*  :containsExactCase() - case sensitive
*  :containsRegex()     - set by user ( use: $(el).find(':containsRegex(/(red|blue|yellow)/gi)') )
*/
$.extend($.expr[':'],{
  containsExact: function(a,i,m){
    return $.trim(a.innerHTML.toLowerCase()) === m[3].toLowerCase();
  },
  containsExactCase: function(a,i,m){
    return $.trim(a.innerHTML) === m[3];
  },
  containsRegex: function(a,i,m){
    var regreg =  /^\/((?:\\\/|[^\/])+)\/([mig]{0,3})$/,
    reg = regreg.exec(m[3]);
    return reg ? RegExp(reg[1], reg[2]).test($.trim(a.innerHTML)) : false;
  }
});

// -, (mb), x*, x*(mb), x, x(mb), X*, X*(mb), X

$("td:containsRegex(/^[xtfv]$/)").addClass("queue");  // x
$("td:containsRegex(/^[xtfv]\\*$/)").addClass("queue review"); // x*
$("td:containsRegex(/^\\([a-z]{2}\\)$/)").addClass("active"); // (mb)
$("td:containsRegex(/^[xtfv]\\([a-z]{2}\\)$/)").addClass("active");  // x(mb)
$("td:containsRegex(/^[xtfv]\\*\\([a-z]{2}\\)$/)").addClass("active review"); // x*(mb)

$("td:containsRegex(/^[XTFV]$/)").addClass("done");  // X
$("td:containsRegex(/^[XTFV]\\*$/)").addClass("queue review");  // X*
$("td:containsRegex(/^[XTFV]\\*\\([a-z]{2}\\)$/)").addClass("active review");  // X*(mb)

$("td:containsExact(-)").addClass("queue"); // -
2 голосов
/ 19 января 2012
"td:containsRegex('/\b[xtfv]\*(?!\()/g')"

\b внутри строкового литерала означает возврат на одну позицию ("\b" === "\x08"), тогда как это означает разрыв слов в регулярном выражении.Попробуйте заменить все \b на \\b.

Также следует правильно изменить \( на [(], поскольку в JS "foo\(bar\)" === "foo(bar)".

...