用任意顺序的字符串数组匹配字符串
Match string with array of string in any order
我的输入是一个字符串,它可以是人的名字、姓氏、组合,甚至是两者的一部分,以特定的顺序
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˙函数进行匹配。这就是为什么˙"约翰·rk"˙是假的,不管你怎么努力,你都可以把˙"约翰·rk"˙按这个特定的顺序串起来。你可以有"约翰·马克"˙,但这与˙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
我认为,创建数组与所有名称(第一,最后,和分隔的中间名)和匹配所有可能的组合可以走的路,但由于这必须做之前,我想知道是否有一个更好的方法。
如果没有更好的方法,如何以尽可能少的处理能力从数组中获得所有可能的组合?
您可以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;
}
对于您的示例将返回true,对于像" john Smi"这样的示例也将返回true,但是区分大小写。如果需要,您可以调整它使其不区分大小写。
如果你有一个完整的字符串,你可以检查int indexOf(String str)
,如果它是-1以外的任何东西,你知道字符串包含单词。如果您想将一个数组转换成这个长字符串,只需执行
for (int i = 0; i < strArray.length; i++)
{
someStr += strArray[i];
}
然后检查someStr.indexOf("John");
编辑,更新
就像你在
上做indexOf
一样
var fullname = "John Mark Bill Smith";
var checkname = fullname.toLowerCase().indexOf(input.toLowerCase()) !== -1;
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")
)
这就是美。
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
相关文章:
- 将JSON转换为typescript中的字符串数组
- 在Javascript中将一个值和字符串数组转换为if语句
- 如何将正则表达式包含到字符串数组中
- JavaScript:将字符串数组转换为文本区域
- Knockout中的字符串数组
- 拆分字符串数组(JavaScript)后未定义
- 使用Javascript获取两个字符串之间的字符串数组
- 打印从Spring MVC Controller发送的字符串数组只显示“;toJSON”;在javascript中
- 将一个字符串数组解析为一个新的数组javascript
- AngularJS - 从字符串数组中连续更改文本
- 使用字符串数组中的字符填充 HTML 表
- 如何在 Javascript 中将字符串数组列表插入到表行中
- 创建二维字符串数组
- 如何从字符串数组中获取子字符串数组
- 如何将字符串数组转换为简单数组
- 按字母顺序、数字顺序和特殊字符对字符串数组进行排序
- 如何从字符串数组中获得8个随机唯一元素
- json_encode($myVar);正在给出地图,我想要一个字符串数组
- 函数,返回javascript中两个字符串数组的差值
- Javascript字符串数组转换为用逗号分隔的多个字符串