使用jQuery的Javascript正则表达式包含正则表达式扩展

时间:2012-01-18 17:11:49

标签: javascript jquery regex contains

我正在使用jQuery“contains”的扩展程序,如下所示:

$.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 个答案:

答案 0 :(得分:5)

好吧,我想我明白了......这些是我所做的改变:

  • 最下面的五个选择器有一个大写字母“E”,应该都是“containsRegex()”
  • 我通过在回复中添加“reg”检查来改变containsRegex,使其更加坚固:

    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)。

无论如何,我会使用此代码和您的demo

更新我的要点
/* 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"); // -

答案 1 :(得分:2)

"td:containsRegex('/\b[xtfv]\*(?!\()/g')"
字符串文字中的

\b表示退格("\b" === "\x08"),而它表示正则表达式中的单词。尝试将所有\b替换为\\b

您应该在JS中\(正确地将[(]更改为"foo\(bar\)" === "foo(bar)"