Javascript正则表达式困难,将字符串与名称匹配

Javascript正则表达式困难,将字符串与名称匹配,javascript,regex,Javascript,Regex,我正在尝试将从服务器获得的名称与用户提供的输入进行匹配,完整名称可能由用户知道,也可能不完全由用户知道,例如,我应该能够匹配以下内容: 获得的姓名:Manuel Barrios Pineda 输入:Manuel P 到目前为止,我已尝试使用以下代码: var name_obtained = 'Manuel Barrios Pineda'; var re = new RegExp('\b[' + name_obtained + ']+\b'); var input_string = 'Manuel

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

获得的姓名: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');
}
下面是一个例子:

编辑1:
它需要匹配输入,如“Manuel B”、“Manuel P”

也许您需要这样的输入

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
var input\u给定='Manuel P'。替换(/[.+*()\[\]]]/g',)。替换(/\?/g',),
获得的名称='Manuel Barrios Pineda',
arr=给定的输入。分割(“”),i,ret=真;
对于(i=0;i
那不行。您的构建将在单词边界之间匹配单个字符。结果将等于

var re = /\b[adeilnoruBMP]\b/;
当获得的
名称\u比
输入字符串长时,这将永远不起作用。请注意,将尝试在
输入字符串中查找正则表达式,而不是相反

因此,我建议使用一些简单的方法,比如

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');
}

双重转义
b
<代码>新RegExp('\\b['+name\u+']+\\b')字符串文字语法也有转义序列,因此要在正则表达式中使用
\b
,您需要提供一个文字
\
字符,这是通过
\\
完成的。正则表达式具体针对什么进行测试?在通过双重转义修复后,或者仅仅删除它们,它也将匹配
“Manuel Pinzon”
。如果您可以实现全文搜索,您可以将字符串匹配放在db上,而不是应用程序逻辑中。OK,我双重转义了,它现在正在“工作”,但Dave Newton注意到类似“Manuel Bartender”的输入将匹配,你知道正则表达式的限制性有多大吗@DaveNewton正则表达式应该匹配像“Manuel B”、“Manuel P”这样的组合。忘了提到我应该能够匹配像“Manuel P”、“Manuel Pineda”、“Manuel B”这样的组合。etcI尝试了你的代码,它不会匹配任何输入字符串,也许我遗漏了什么。尝试了你的解决方案,它工作得很好,尽管我仍然在努力理解你是如何做到这一点的,因为我是正则表达式的新手。第一行清理输入,然后测试输入中的每个单词,看看名称是否包含单词(至少是以输入中的单词开头):
for
循环比正常情况下要复杂一些,注意
和&ret
;i、 e.如果
ret
变为false,则结束。
var name_obtained = 'Manuel Barrios Pineda';
var input_string = 'Manuel';

if (name_obtained.indexOf(input_string) > -1) {
    alert('Match');
} else {
    alert('No Match');
}
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');
}