如何使用 JQuery 数据表通过正则表达式隐藏某些行

How to hide certain rows via Regex with JQuery Datatable

背景

我有一个datatables table多行数据;以及 Datatables 文档中的一对自定义按钮:

$(document).ready(function() {
   /* t is the datatable */
   var t = $('#dtabl').DataTable({
       ....
       ....
       buttons: [
            {
                text: 'Hide Horse Academys',
                action: function ( e, dt, node, config ) {
                    t.columns(1).search('some regex', true, true).draw();
                }
            },
            {
                text: 'Show Horse Academys',
                action: function ( e, dt, node, config ) {
                    t.columns(1).search('', true, false).draw();
                }
            }
     ]
    });
});

这些按钮应该在数据table中隐藏和显示,其中特定列包含或不包含特定文本。

我试图隐藏的文本最初是列中包含“学院”一词的所有行;

因此:

    {
       text: 'Hide Horse Academys',
       action: function ( e, dt, node, config ) {
          t.columns(1).search('^(?:(?!academy).)*', true, true).draw();
       }
    },

由此数据tables 搜索扫描列 (1) 以查找符合 search documentation.

的文本

这使用否定前瞻组来 return 发现不包含值“学院”。

有效。

问题

我现在被要求开发这个只隐藏某种类型的学院,所以跳跃学院应该保持在视野中。我想我可以通过并行搜索来做到这一点:

只隐藏文中出现“学院”一词而没有出现“跳跃”一词的行。

但这很难做到,它似乎可以在 Regex101.com 上运行,但我无法在网站上的 Javascript 上运行;

我需要的是:

我的密码是:

 t.columns(1).search('^(?:(?!.*academy.*).(?=.*jump.*))', true, true).draw();

不包含 academy 但包含 jump

的文本

问题在于它显示 包含跳转

的文本

进一步的发展是这个 - 下面 - 哪种工作但有时会错过比赛;

 t.columns(1).search('^(?:(?!.*academy.*)(?=.*jump.*|.*)).*', true, true).draw();

我已经阅读了关于 Javascript 正则表达式(我更熟悉 PCRE)和 this answer 的各种文档,但我看不出如何将我需要的内容放入 datatables.search() 看点.

预期结果:

Academy of saddles - 隐藏(包含学院不包含跳跃)
Academy of jumps - 显示(包含学院但也跳跃)
Show jumping academy - 显示(包含学院但也跳跃)
Horse shoe surprise - 显示 (不包含学院)
Trailer Academy - 隐藏(包含学院不包含跳跃)
Jumpkick Academy - 显示(包含学院但也跳跃)

问题:

通过对 Regex 测试工具的一些挖掘和探索,我想出了一个可行的解决方案:

^(?: (?!.*academy) | ( (?=.*jump)(?=.*academy) ) )

解释:

^       = start of string
(?:     = start of non-capture group
(?!     = start of negative lookahead capture group ("not contains")
.       = any character
*       = zero or more times (greedy)
academy = the literal word academy
)       = close negative capture group
|       = OR | alternative seperator
(       = second capture group 
(?=     = open positive capture group, must contain
.*      = any character, zero or more times 
jump    = the literal word jump
)       = close positive capture group
(?=     = open positive capture group 
.*      = you know this by now ;)
academy = the literal word academy
))      = close positive capture group, close alternative capture group
)       = close entire non-capture group.

(感谢 PoulBak 在评论中证实了我的想法,我的原始版本中 .* 太多了)

所以以上将 return 对任何字符串为真:

Does not contain "academy" OR does contain "academy" AND "jump"

因此最终的 Datatables JS 代码将如下所示:

 t.columns(1).search('^(?:(?!.*academy)|((?=.*jump)(?=.*academy)))', true, true).draw();