正则表达式前瞻性能问题 nestjs, mongodb [重复]

Regex lookahead performance issues nestjs, mongodb [duplicate]

提问人:sdoedos 提问时间:11/16/2023 最后编辑:sdoedos 更新时间:11/16/2023 访问量:55

问:

使用Nestjs和Mongodb,尝试在数据库中搜索包含所有关键字(这是一个字符串数组)的所有“摘要”。

它有效,但性能真的很差,有谁知道任何其他替代方案或更好的做法?

filters.keywords = 字符串数组 / string[]

MongoDB 中的 summary 字段只是一个字符串。

      const regex = new RegExp(
       '(?=.*?\\b' + filters.keywords.join(')(?=.*?\\b') + ').*',
        'i',
      );
      return this.articleModel
        .find({
          summary: { $regex: regex },
        })
        .exec();
节点.js 则表达式 打字稿 MongoDB NestJS

评论

0赞 Wiktor Stribiżew 11/16/2023
你为什么要使用前瞻?不起作用?'\\b(?:' + filters.keywords.join('|') + ')'
0赞 sdoedos 11/16/2023
这将导致匹配,即使所有关键字都不在字符串中也是如此。我试图确保所有关键字都在字符串中。

答:

2赞 sln 11/16/2023 #1

将 BOS 和 EOS 添加到正则表达式中。
去掉点并替换为也匹配换行符的点。
.[\S\s]

    var filters = ['howdy','dooty','tooty'];

    const regex = new RegExp(
           "^(?=[\\S\\s]*\\b" + filters.join(")(?=[\\S\\s]*\\b") + ")[\\S\\s]*$", "i"
          );


    console.log(regex);

输出 /^(?=[\S\s]*\bhowdy)(?=[\S\s]*\bdooty)(?=[\S\s]*\btooty)[\S\s]*$/i

评论

0赞 sln 11/20/2023
当然,这是 Match 精确字符串的副本,但一切都不是吗,真的吗?但是像正则表达式这样的密码不是一个精确的字符串。管理员,这怎么可能是真正的重复?显然不是。很难相信所有帐户的重复行为标记都得到了 SO 的认可。是吗?95% 的正则表达式问题被标记为重复或由单个成员关闭。一页包含 20 个正则表达式问题,涵盖 3 天。意味着没有人在使用 SO。广告是怎么想的?