1

我正在尝试将从服务器获得的名称与用户提供的输入进行匹配,完整的名称可能会或可能不会被用户完全知道,例如我应该能够匹配以下内容:

获得的姓名:Manuel Barrios Pineda
输入给定:Manuel P

到目前为止,我已经尝试过使用以下代码:

var name_obtained = 'Manuel Barrios Pineda';
var re = new RegExp('\b[' + name_obtained + ']+\b');
var input_string = 'Manuel';

if (input_string.match(re)) {
    alert('Match');
} else {
    alert('No Match');
}

这是一个示例: jsfiddle示例

编辑1:需要匹配'Manuel B','Manuel P'之类的输入

4

2 回答 2

2
var name_obtained = 'Manuel Barrios Pineda';
var re = new RegExp('\b[' + name_obtained + ']+\b');

那是行不通的。您构建一个字符类来匹配单词边界之间的单个字符。结果将等于

var re = /\b[adeilnoruBMP]\b/;
input_string.match(name_obtained)

name_obtained当比 长时,这永远不会起作用input_string。请注意,match它将尝试在 中查找正则表达式input_string不是相反。

因此我建议使用一些简单的东西,比如

var name_obtained = 'Manuel Barrios Pineda';
var input_string = 'Manuel';

if (name_obtained.indexOf(input_string) > -1) {
    alert('Match');
} else {
    alert('No Match');
}

要使用您input_string的正则表达式在获得的名称中搜索省略中间名或结束字符,您可以这样做

String.prototype.rescape = function(save) {
    return this.replace(/[{}()[\]\\.?*+^$|=!:~-]/g, "\\$&");
}

var name_obtained = 'Manuel Barrios Pineda';
var input_string = 'Manuel'; // or 'Manuel P', 'Manuel Pineda', 'Manuel B', 'Barrios P', …

var re = new RegExp("\\b"+input_string.rescape().split(/\s+/).join("\\b.+?\\b"));
if (re.test(name_obtained)) {
    alert('Match');
} else {
    alert('No Match');
}
于 2013-07-23T17:19:33.090 回答
1

也许你想要这样的东西

var input_given = 'Manuel P'.replace(/[.+*()\[\]]/g, ' ').replace(/\?/g, '.'),
    name_obtained = 'Manuel Barrios Pineda',
    arr = input_given.split(' '), i, ret = true;

for (i = 0; i < arr.length && ret; ++i) // for each word A in input
    if (arr[i]) // skip ""
        ret = new RegExp('\\b' + arr[i]).test(name_obtained);
            // test for word starting A in name
// if test failed, end loop, else test next word

if (ret) alert('Match'); // all words from input in name
else alert('No Match');  // not all words found
于 2013-07-23T17:13:40.410 回答