将字符串与任何顺序的字符串数组匹配

时间:2015-10-24 01:03:34

标签: javascript arrays match string-matching

我的输入是一个字符串,它可能是个人的名字,姓氏,组合,甚至是特定顺序的一部分

Class {
    first = 'John'          //  just simple string
    last = 'Smith'          //  just simple string
    middle = 'Mark Bill'    //  this is often empty string, but may contain multiple, divided by spaces. ('' or 'Mark Bill')

    hasPresent(what){
        return true || false
    }
}

如果用户的输入是'John',我们John的hasPresent方法应该返回true 其他情况:

"input" => expected result

"Smith" => true
"mark" => true
"John Mark" => true
"hn mar" => true
"m" => true
" " => true

"John John" => false
"John Mark John" => false
"Jo Mark" => false
"John rk" => false
"n n n" => false

为了更好地理解,想象一下,只要您只使用一次,就可以按任何顺序订购此人的姓名。然后输入并与˙indexOf˙函数匹配。也就是说,为什么˙“John rk”˙是假的,你尝试的一切都很难,你可以按照这个特定的顺序组合一个有“˙”john rk“˙的字符串。你可以有˙“John Mark”˙,但这与˙indexOf˙不相符。

从我们的名字,我们可以匹配任何匹配任何下面的字符串

"John Smith Mark Bill","John Mark Smith Bill","John Bill Smith Mark","John Mark Smith Bill","John Smith Bill Mark", "John Mark Bill Smith" etc



我认为,使用所有名称(第一个,最后一个和分隔的中间名称)创建数组并匹配所有可能的组合可能是要走的路,但由于必须在此之前完成,我想知道是否有更好的方式。

如果没有更好的方法,如何以尽可能小的处理能力从阵列中制作所有可能的组合?

4 个答案:

答案 0 :(得分:2)

您可以concat所有名称,并且对于用户输入的每个单词,检查字符串中是否存在。

first = 'John';
last = 'Smith';
middle = 'Mark Bill';

searchStr = first + " " + middle + " " + last;

function hasPresent(param){
  searchLower = searchStr.toLowerCase();
  searchWords = param.toLowerCase().split(" ");
  for (i = 0; i < searchWords.length; i++){
    index = searchLower.indexOf(searchWords[i])
    if (index == -1){
      return false;
    }
    searchLower = searchLower.substring(0,index) + searchLower.substring(index + searchWords[i].length, searchLower.length);
  }
  return true;
}

对于您的示例,以及&#34; Joh Smi&#34;等示例,这将返回true,但区分大小写。如果需要,您可以对其进行调整以使其不区分大小写。

答案 1 :(得分:0)

如果你有一个完整的字符串,你可以检查if ($q='Admin') { ,如果它不是-1,你知道字符串包含单词。如果你想将数组转换为这个长字符串,只需执行类似

的操作
int indexOf(String str)
然后检查     for (int i = 0; i < strArray.length; i++) { someStr += strArray[i]; }

答案 2 :(得分:0)

修改,更新

  

就像在

上做indexOf一样
var fullname = "John Mark Bill Smith";
var checkname = fullname.toLowerCase().indexOf(input.toLowerCase()) !== -1;

&#13;
&#13;
var fullname = "John Mark Bill Smith";
var check = function(input) {
  return fullname.toLowerCase().indexOf(input.toLowerCase()) !== -1
}

console.log(check("Smith")
           , check("mark")
           , check("John Mark")
           , check("hn mar")
           , check("m")
           , check(" ")
           , check("John John")
           , check("John Mark John")
           , check("Jo Mark")
           , check("John rk")
           , check("n n n")
           )
&#13;
&#13;
&#13;

答案 3 :(得分:-2)

这是一种美丽。我的订单周期尽可能少。

hasPresent(what:string|number):boolean {
    if(isNumber(what)){
        return this.tel.hasPresent(what)
    }else{
        if (this.tel.hasPresent(what)) {
            return true
        }else{
            var query = what.toString().toLowerCase().split(' ')
            var possible = this.name.toLowerCase().trim().split(' ')
            if(query.length > possible.length){
                return false    //  No way this could be met
            }
            for (var i = possible.length - 1; i > 0; i--) {
                var possible2 = this.name.toLowerCase().trim().split(' ')
                if(possible[i].hasPresent(query[0])){
                    if (query.length==1){
                        return true
                    }
                    possible2.remove(possible[i])
                    for (var j = 1; j < query.length; j++){
                        var passed = false
                        for (var k = possible2.length - 1; k > 0; k--) {
                            if(possible2[k].indexOf(query[j]) == 0){
                                possible2.remove(possible2[k])
                                passed = true
                                break
                            }
                        }
                        if(!passed){
                            break
                        }
                    }
                    if(passed){
                        return true
                    }
                }
            }
            return false
        }
    }
}

旁注:

Array.remove(object) - removes object for array
Array|String.hasPresent(needle) - shortcut for indexOf(needle) => 0