如何使用 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 上运行;
我需要的是:
- 一行正则表达式 return如果满足以下条件则为真:
- 文字不包含'academy'或
- 文本确实包含 'academy' 并且 NOT 也包含 'jump'
我的密码是:
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
- 显示(包含学院但也跳跃)
问题:
- 如何创建所需的 ECMA 正则表达式?
通过对 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();
背景
我有一个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 上运行;
我需要的是:
- 一行正则表达式 return如果满足以下条件则为真:
- 文字不包含'academy'或
- 文本确实包含 'academy' 并且 NOT 也包含 'jump'
我的密码是:
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
- 显示(包含学院但也跳跃)
问题:
- 如何创建所需的 ECMA 正则表达式?
通过对 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();