精确匹配正则表达式中的多个单词(数据表)
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(?![^,]))");
(?:[^,]|^)
/ (?<![^,])
(等于(?<=,|^)
)部分需要字符串位置的开头或在搜索词之前的逗号,而(?![^,])
否定前瞻需要逗号或字符串结尾紧邻的当前位置((?![^,])
等于 (?=,|$)
正前瞻)。
【讨论】:
以上是关于精确匹配正则表达式中的多个单词(数据表)的主要内容,如果未能解决你的问题,请参考以下文章