【问题标题】:Regex for search, a more refined fuzzy search搜索的正则表达式,更精细的模糊搜索
【发布时间】:2017-11-11 14:43:53
【问题描述】:

我现在有通用的模糊搜索,所以如果输入“a”,它会返回包含 A 的每个单词。但是我想要一个更精细的搜索来做到这一点。

例如我有这个词:'Frankster Muniz'

搜索“frank”、“fr”、“f”、“mun”、“m”确实会返回“Frankster Muniz”

搜索“rank”、“ster”、“r”、“niz”不会返回任何内容

它必须匹配第一个开头的单词,我不知道从哪里开始。我对正则表达式很陌生。谢谢

【问题讨论】:

  • 你的尝试怎么样?发布您的正则表达式以查看哪里出了问题。
  • 类似/\bfrank/i 的东西?又名:RegExp("\\b" + term, "i") 通过你的测试
  • 如果你想匹配一个完整的单词,使用RegExp(`\\b${search}\\w*`, 'i')——别忘了escape'search'

标签: javascript regex search full-text-search


【解决方案1】:

你可以从这个开始:

如果input 是用户输入,name 是数据库中的名称,

var name = "Frankster Muniz";
var input = "Frank";

function match(name,input){
var matched = 0;
if(name.match(new RegExp("\\b"+input+".*","i")))
  matched=1;
return matched;
}

console.log(match(name,"Frank"));
console.log(match(name,"ster"));

【讨论】:

    【解决方案2】:

    您可以使用单词边界字符\b 从单词的开头开始匹配。所以正则表达式的威力就变成了:

    new RegExp(`\\b${input}`, 'i');
    

    查看交互式示例:

    let names = [
      'Frankster Muniz',
      'Sarah Walin',
      'Tyler Robinson',
      'Ronald Muniz'
    ];
    
    let results = document.querySelector('#results');
    let input = document.querySelector('input');
    input.addEventListener('input', function() {
      findUsers(this.value);
    });
    
    buildList(names);
    
    function findUsers(input) {
      let reg = new RegExp(`\\b${input}`, 'i');
      let found = names.filter(name => reg.test(name));
      buildList(found);
    }
    
    function buildList(names) {
      let html = '';
      names.forEach(name => html += `<li>${name}</li>`);
      results.innerHTML = html;
    }
    <label>Filter:</label>
    <input id="search">
    <br><br>
    <div>Names:</div>
    <ul id="results"></ul>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-18
      • 2010-12-15
      • 1970-01-01
      • 1970-01-01
      • 2021-03-27
      • 1970-01-01
      • 2014-12-28
      • 2021-01-15
      相关资源
      最近更新 更多