4

我如何找到与搜索条件不匹配的单词,但其中包含相同的字母?

这是一个可以玩的小提琴。

如果,则显示用户键入的au第一个 2nd 条目。但是当用户输入时,我怎样才能实现同样的事情ua呢?

JS

我使用以下内容搜索valuefrom aninput并检查它是否存在于列表中:

$("#search").on("keyup click", function () {
  var value = this.value.toLowerCase();

  $("#list").children().each(function () {
    var text = this.innerText.toLowerCase();
    $(this)[text.indexOf(value) !== 0 ? 'hide' : 'show']();
  });
});

HTML

<input type="search" id="search">

<ul id="list">
    <li><a href="#/australia/">Australia</a></li>
    <li><a href="#/austria/">Austria</a></li>
    <li><a href="#/belgium/">Belgium</a></li>
    <li><a href="#/brazil/">Brazil</a></li>
    <li><a href="#/canada/">Canada</a></li>
    <li><a href="#/denmark/">Denmark</a></li>
    <li><a href="#/finland/">Finland</a></li>
    <li><a href="#/france/">France</a></li>
    <li><a href="#/germany/">Germany</a></li>
    ...and so on...
</ul>

我不是很熟悉RegExp,但我认为这会成功吗?!

4

3 回答 3

3

我只是编造了这个功能。如果text包含子字符串,则返回 true value;即使字母被打乱了**:

function fuzzyContains(text, value) {
    // for value = "THE", build the regex /[the]{3}/ and test
    var valueCopy = value.toLowerCase().replace(/\W/g, "");
    var regexp = new RegExp("[" + valueCopy + "]{" + valueCopy.length + "}");
    return regexp.test(text.toLowerCase());
}
fuzzyContains("Netherlands", "Nethe") // true
fuzzyContains("Netherlands", "Neteh") // true
fuzzyContains("Netherlands", "Nethl") // false

演示在这里

更新

这是该功能的修订版。如果text包含来自value** 的所有字符,则返回 true:

function fuzzyContains_v2(text, value) {
    var textCopy = text.toLowerCase();
    var valueCopy = value.toLowerCase().split("");
    console.log(textCopy, valueCopy);
    var a = $.grep(valueCopy, function (value) {
        return textCopy.indexOf(value) == -1;
    });
    return a.length == 0;
}
fuzzyContains("Netherlands", "Nethe")    // true
fuzzyContains("Netherlands", "Neteh")    // true
fuzzyContains("Netherlands", "Nethl")    // true
fuzzyContains("Netherlands", "Netlands") // true

演示在这里

** 我没有测试value包含重复字符时的行为。但是我相信结果仍然是可以接受的。

于 2013-01-13T18:38:00.543 回答
2

RegExp 无法做到这一点,但是您可以使用以下功能来满足您的需求:

function looseCharacterMatch(a, b) {
  a = a.split("");
  b = b.substring(0,a.length);
  var c = true;
  for (var i = 0; i < a.length; i++) {
    if (b.replace(a[i], "") == b) {
      c = false;
    }
    b = b.replace(a[i], "");
  }
  return c;
}

演示| 演示源

于 2013-01-13T17:54:34.297 回答
0

试试这个:

var text = this.innerText.toLowerCase();

text = text.replace(/([a-z]*)([A-Z]*)/, '$2$1');
于 2013-01-13T17:23:07.407 回答