【问题标题】:regex get closest match to given string正则表达式获得与给定字符串最接近的匹配
【发布时间】:2019-03-05 22:21:57
【问题描述】:

我的代码中有一个正则表达式搜索,用于通过给定的字符串在我的数据库中获取名称。我遇到的问题是,如果我有一个名字“Jim”和一个名字“Jimmy”,出于某种原因,我总是得到“Jimmy”。

let regexp = new RegExp(userName, "i");
let name = await names.findOne({ name: regexp });

所以当我输入“Jimmy”时,我得到了 Jimmy,“Jimm”我得到了 Jimmy,一切都很好,但是当我试图找到“Jim”时,我得到了 Jimmy,所以我没有办法得到 Jim。

如果他们有 ( 或 ) 我也找不到名字?例如:Tom (Thomas),我准确搜索“Tom (Thomas)”,但根本找不到,但这可能是 Mongoose 的问题。

【问题讨论】:

  • 你能把正则表达式放进去吗?
  • 不是只找到一个匹配,而是获取所有匹配。然后从 seach 字符串中计算Levenshtein distance 到所有匹配项中找到最接近的那个。
  • () 在正则表达式中有特殊含义,如果你想从字面上匹配它们,你需要将它们转义。您确定首先需要使用正则表达式吗?
  • 我会转义它们,但它们在一个变量中,并且该变量是用户的输入,所以我需要一种方法来告诉正则表达式忽略 () 或其他东西
  • 您确定需要使用正则表达式吗?您可以使用String.prototype.includes() 来查找文字子字符串吗?

标签: javascript regex mongoose


【解决方案1】:

我认为这是您如何订购数据库的问题,或者至少是您从中查询的结果的问题。您可以对表格进行排序,也可以在查询结果后对其进行排序。

尝试使用以下之一(按字母顺序或反字母顺序):

let name = await names.sort({ name: 1 }).findOne({ name: regexp });
let name = await names.sort({ name: -1 }).findOne({ name: regexp });

对于您的第二个问题,您似乎想要调查“模糊匹配” - 这样Tom 之类的东西就可以返回Thomas 之类的结果。

试着看看这个:

Fuzzy Searching with Mongodb?

【讨论】:

  • 他的正则表达式就是他要搜索的名字:regexp = new RegExp(userName, "i");
  • 谢谢 Barmar - 我之前错过了
  • names.findOne({ name: regexp },null, { sort:{ name: -1 } });这行得通,我仍然需要解决(和)的问题
  • 很高兴听到@FrancoTorqusBoragno。如果这有帮助,请点赞并接受,并为您遇到的其他问题提出一个新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多