查找关键字匹配项,但根据 ReGex JS 中的单词接近度忽略

Find keyword matches, but ignore based on word proximity in ReGex JS

我正在尝试为长字符串中的某个词查找匹配项,但我想在第一个匹配项周围设置一个接近度,以便忽略在该接近度内匹配的任何单词。

例如,如果我有一个示例字符串,我正在寻找 test:

Lorem ipsum Test sit amet, consectetur adipiscing elit. 
Vestibulum at erat ac enim malesuada pulvinar et nec ante. 
Cras erat ipsum, pellentesque vel volutpat ut, Test eu test. 
Test Quisque tincidunt varius mi.

并且此示例使用 15 words 的邻近度,我的最终结果将突出显示这些:

Lorem ipsum **Test** sit amet, consectetur adipiscing elit. 
Vestibulum at erat ac enim malesuada pulvinar et nec ante. 
Cras erat ipsum, pellentesque vel volutpat ut, **Test** eu test. 
Test Quisque tincidunt varius mi.

所以它只找到第一个 && 大于 15 个单词的 Test


到目前为止,我已经尝试过类似的方法:

\btest\W+(?:\w+\W+){15,}?test\b

但是这似乎是高亮之间的所有单词,当我真的只想高亮test。它还要求我设置 2 个关键字参数,如果可能的话,我只想使用一次 test 关键字。

关于如何实现这种接近行为有什么想法吗?


澄清更新:

我这里有一个关于正则表达式测试器的例子:https://regex101.com/r/FDOWZU/1 您可以看到它选择了 test 实例之间的全部单词。 Current output

然而,我想要的是更像这样的东西: Expected output

不确定您的意思是 >=15 还是 >15,因为您的代码和书面逻辑相互矛盾。在任何情况下,您都可以将 14 替换为搜索的字数。在这种情况下,优势 14 确保 test 不是接下来的 15 个单词之一,因此只有当接下来的 15 个单词不是 test 时,它才会匹配 test


您可以使用以下正则表达式:

See regex in use here

\btest(?!\W+(?:\w+\W+){0,14}test)

s = `Lorem ipsum Test sit amet, consectetur adipiscing elit. Vestibulum at erat ac enim malesuada pulvinar et nec ante. Cras erat ipsum, pellentesque vel volutpat ut, Test eu test. Test Quisque tincidunt varius mi. Suspendisse vitae lobortis diam. Vestibulum posuere massa id lectus faucibus posuere. Donec non sollicitudin est. Donec libero turpis, malesuada in Test`
r = /\btest(?!\W+(?:\w+\W+){0,14}test)/gi
var m
while(m = r.exec(s)) {
  console.log(m)
}

工作原理:

  • \b字边界
  • test 字面匹配(使用 i 标志不区分大小写)
  • (?!\W+(?:\w+\W+){0,14}test) 否定前瞻确保以下内容不匹配:
    • \W+ 匹配任何非单词字符一次或多次
    • (?:\w+\W+){0,14} 匹配零到十四个字
    • test 字面匹配(再次不区分大小写)

这是一个working regex(?<!test(?:\w|\s)*\W{0,14})test

这是括号中的工作原理:

  • ?<! 是负向回顾符号
  • test 寻找 test 个词
  • (?:\w|\s)* 后跟任意数量的非单词或 space 个字符
  • \W{0,14}然后是0到14个字

所以总的来说它给出了:找到所有 不是 test 词,后面跟着一个 test 词,后面跟着最多 15 个词。