我正在尝试编写一个搜索函数,允许用户输入以下条件之一来返回"胡志明市"。对我来说棘手的是它必须始终搜索任何单词的开头。最重要的是,它还必须与其他语言一起使用,但是如果我可以让拉丁字符工作,那至少是一个开始。
//ho chi minh city
//hochiminhcity
//chi minh
//chiminh
//chiminhcity
//chi minh city
//ho
//chi
//minh
//city
containsTerm: function containsTerm (needle, haystack) {
var _this = LocationPickerCtrl,
ndl = _this.formatStr(stringHelper.escapeRegExp(needle)),
re = new RegExp('(?:^|\s)' + ndl, 'gi'),
found = false,
len,
key = _this.formatStr(haystack.Key),
name = _this.formatStr(haystack.Name);
//check airport code
if (key.indexOf(ndl) > -1) {
found = true;
}
//start of word
if (re.test(name)) {
found = true;
}
if (name.indexOf(' ') > -1) {
if (name.replace(/s/g, '').indexOf(needle) === 0) {
found = true;
}
}
return found
}
任何帮助将不胜感激。提前谢谢你!
没有及时看到您需要正则表达式:(
var words = ['ho', 'chi', 'minh', 'city'];
var hochiming = function hochiming(words, input) {
var data = input;
var match = false;
for (var i = 0; i < words.length; i++) {
if (data.length === 0) {
return match;
} else if (data.substring(0, words[i].length) === words[i]) {
match = true;
data = data.substring(words[i].length);
if (data[0] === " ") {
data = data.substring(1);
}
} else if (match) {
return false;
}
}
return match;
}
var data = ['hochiminhcity', 'chi minh', 'chiminh', 'chiminhcity', 'chi minh city', 'ho', 'chi', 'minh', 'city'];
data.forEach(function(entry) {
console.log('result:', hochiming(words, entry));
});
console.log('mistakes:');
(['ho chi minh ci', 'm aezfam', 'hochimineahcity', ' minhchi']).forEach(function(entry) {
console.log('result:', hochiming(words, entry));
});
如果你走正则表达式路线,它可以像这样完成 -
# /(?=[hcm])(?:(?:ho)?s*chis*minh(?:s*city)?|(?:ho|chi|minh|city))/
(?= [hcm] ) # Start at a 'h', 'c', or 'm'
(?:
(?: ho )? # Optional 'ho'
s* chi s* minh # Must have 'chi minh'
(?: s* city )? # Optional 'city'
| # or,
(?: ho | chi | minh | city ) # One of either 'ho','chi','minh', or 'city'
)