精确匹配正则表达式中的多个单词(数据表)

Posted

技术标签:

【中文标题】精确匹配正则表达式中的多个单词(数据表)【英文标题】: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 这行得通!您是否可以发布带有正则表达式解释的答案?多了解一点会很好,让我有机会标记为已回答 【参考方案1】:

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

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

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

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

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

【讨论】:

以上是关于精确匹配正则表达式中的多个单词(数据表)的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式匹配一个精确的单词,它的前面或后面只能有空格等

正则表达式

什么是正则表达式中的单词边界?

如何在正则表达式中匹配多个单词

正则表达式:匹配除一个单词之外的所有内容[重复]

正则表达式精确匹配 5 位数字