首页 > 解决方案 > 仅匹配正则表达式的一部分

问题描述

我需要使用过滤名称列表regex

我以这种格式存储数据

[
 {
  "firstName": "Jhon",
  "lastName": "Doe",
 },
 ...
]

用户可以输入全名、名字或姓氏。但我需要将它们全部匹配。我的 mongo 查询是这样的(我曾经Loopback 4构建过这个查询,但想法很明显)

        {
          or: [{firstName: new RegExp(searchKey, 'i')}, {lastName: new RegExp(searchKey, 'i')}],
        };

但这在用户输入jhon doe时不匹配,但仅在输入名字或姓氏时有效。

我的问题是,有没有办法将部分字符串与正则表达式匹配?

预计将成功匹配所有“jhon”、“doe”、“jhon doe”和“jhondoe”

标签: javascriptregexmongodb

解决方案


我不知道是否有可能编写一个可以做到这一点的通用正则表达式,我做了一个蛮力算法来构建正则表达式。

let text = `[
    {
     "firstName": "Jhon",
     "lastName": "Doe",
    },
    ...
   ]`;

// Brute force
let key = "jhondoe";
let keyArr = [];
for (let i = 0; i < key.length; i++) {
    let a = key.slice(0, i);
    let b = key.slice(i);
    a && keyArr.push(a);
    b && keyArr.push(b);
}
let keySearch = keyArr.join("|");
console.error(keySearch);
let regex = new RegExp(`"(?:first|last)Name": "(${keySearch})"`, `gim`);
let matches = text.match(regex);
console.log(matches);


推荐阅读