【问题标题】:Exact match multiple words in regex (datatables)精确匹配正则表达式中的多个单词(数据表)
【发布时间】:2022-01-22 00:10:18
【问题描述】:

我正在尝试在 Datatables 中创建一个匹配属于所有选定组的用户的正则表达式搜索。

例子:

用户 A 属于 用户其他其他用户

用户 B 属于用户其他

如果选择 用户其他用户 作为过滤器,则只有用户 A 应显示在表格中。我遇到的问题是两个用户都在选择这些过滤器时显示。我认为正则表达式不匹配确切的字符串,并且在查看了多个其他答案之后,我似乎无法让它这样做。

我的解决方案:

if (!this.items.length) {
    table.column(i).search('');
} else {
    let regex = '^';

    this.items.forEach(v => regex += `(?=.*\\b${v}\\b)`);

    regex += '.*$'

    table.column(i).search(regex, true, false, true)
}

结果:^(?=.*\bUsers\b)(?=.*\bOther Users\b).*$

但是,属于Users,Other的用户仍在返回。

【问题讨论】:

  • 试试这个:this.items.forEach(v => regex += "(?=.*(?<!\\S)${v}(?!\\S))");
  • 它必须是 this.items.forEach(v => regex += "(?=.*(?<![^,])${v}(?![^,]))"); 或 - 如果不支持后视 - this.items.forEach(v => regex += "(?=.*(?:[^,]|^)${v}(?![^,]))");
  • @WiktorStribiżew 这行得通!您是否可以发布带有正则表达式解释的答案?多了解一点会很好,让我有机会标记为已回答

标签: javascript regex datatables


【解决方案1】:

您可以在每个搜索词之前和之后强制执行逗号或字符串开头/结尾检查:

this.items.forEach(v => regex += "(?=.*(?:[^,]|^)${v}(?![^,]))");

或者,如果 JavaScript 环境支持lookbehinds:

this.items.forEach(v => regex += "(?=.*(?<![^,])${v}(?![^,]))");

(?:[^,]|^) / (?&lt;![^,])(等于(?&lt;=,|^))部分需要字符串位置的开头或在搜索词之前的逗号,而(?![^,]) 否定前瞻需要逗号或字符串结尾紧邻的当前位置((?![^,]) 等于 (?=,|$) 正前瞻)。

【讨论】:

    猜你喜欢
    • 2017-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多