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

我正在使用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正则表达式测试器上测试过,并且它们已经工作)不能使用此函数。 这些是我想要匹配的各种字符串:

注意,“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*]\([az]{2}\)/g')").addClass("1 active"); // (mb) $("td:containsRegex('/\b[xtfv]\*(?!\()/g')").addClass("2 queue review"); // x* $("td:containsRegex('/\b[xtfv]\*(?:\([az]{2}\))/g')").addClass("3 active review"); // x*(mb) $("td:containsRegEx('/\b[xtfv](?![*\(])/g')").addClass("4 queue"); // x $("td:containsRegEx('/\b[xtfv](?:\([az]{2}\))/g')").addClass("5 active"); // x(mb) $("td:containsRegEx('/\b[XTFV]\*(?!\()/g')").addClass("6 queue review"); // X* $("td:containsRegEx('/\b[XTFV]\*(?:\([az]{2}\))/g')").addClass("7 active review"); // X*(mb) $("td:containsRegEx('/\b[XTFV](?![*\(])/g')").addClass("8 done"); // X 

其中大多数都会在Chrome中传递错误。 有没有人有任何指针? 包含扩展名是否以某种方式限制?

在此先感谢您的帮助!

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

  • 最下面的五个选择器有一个大写“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; } 
  • 正则表达式中的所有转义字符都需要双重转义(即\(需要为\\( ))

  • 我删除了所有的单引号,以帮助我分心

  • 我删除了class级姓名号码。 我知道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(/^\\([az]{2}\\)$/)").addClass("active"); // (mb) $("td:containsRegex(/^[xtfv]\\([az]{2}\\)$/)").addClass("active"); // x(mb) $("td:containsRegex(/^[xtfv]\\*\\([az]{2}\\)$/)").addClass("active review"); // x*(mb) $("td:containsRegex(/^[XTFV]$/)").addClass("done"); // X $("td:containsRegex(/^[XTFV]\\*$/)").addClass("queue review"); // X* $("td:containsRegex(/^[XTFV]\\*\\([az]{2}\\)$/)").addClass("active review"); // X*(mb) $("td:containsExact(-)").addClass("queue"); // - 
 "td:containsRegex('/\b[xtfv]\*(?!\()/g')" 

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

你也应该正确地改变\([(]因为在JS中, "foo\(bar\)" === "foo(bar)"