我有点陷入困境,试图找出以下正确的正则表达式语法:
考虑这个输入:
var input = "sdkfjhd board hjh alabama jdjd bat";
与
匹配 var arr = ["Board of Pre University Education", "Alabama Autonomous Board", "Batman Gotham Bruce", "Superman KalEl Clark", "Board of Whatever"];
var split_input = input.split(' ').join(")|^(");
var re = new RegExp("^(" + split_input + ")", "i"); // /^(sdkfjhd)|^(board)|^(hjh)|^(alabama)|^(jdjd)|^(bat)/i
我想将多个^(xyz)表达式与|组合如果左边条件为真,则运算符将作为OR运算符短路,并且首先匹配以'sdkfjhd'开头的任何内容,如果找到则只匹配以'sdkfjhd'开头的项目...否则,继续执行下一个字符串'board ' 等等.. 所以遵循代码
var result = $.grep(arr, function( a ){
return re.test(a);
});
生成此输出:
["Board of Pre University Education", "Alabama Autonomous Board", "Batman Gotham Bruce", "Board of Whatever"]
我只想要它
["Board of Pre University Education", "Board of Whatever"]
因此,如果任何左侧表达式首先找到匹配,我试图找到一种方法来跳过所有右侧表达式。考虑相同的输入字符串"sdkfjhd board hjh alabama jdjd bat"
...'sdkfjhd'将不会产生任何结果,因此它会转移到'board',Board会找到匹配并产生2个结果:["Board of Pre University Education", "Board of Whatever"]
。现在发现一个或多个匹配,它不应该移动到下一个表达式,即'hjh','alabama','jdjd'或'batman'。希望它更清楚,谢谢!
对此的任何帮助将不胜感激。 谢谢:)!
PS:这是一个小提琴http://jsfiddle.net/4h26vLq8/40/
答案 0 :(得分:1)
正则表达式正常运行。 |作为OR工作,但你不匹配单词边界。因此:
{i}作为new RegExp
中的第二个参数表示一个case-insentive regexp。
您可以使用单词边界\ b来匹配整个单词:
var split_input = input.split(' ').join("\\b)|^(\\b");
var re = new RegExp("^(\\b" + split_input + "\\b)", "i");
对于单词一般匹配而不仅仅是第一个单词,您可以从正则表达式中删除^:
var split_input = input.split(' ').join("\\b)|(\\b");
var re = new RegExp("(\\b" + split_input + "\\b)", "i");
编辑:在澄清一些评论之后: 它应该只从输入字符串中的第一个单词得到匹配:
var input = "sdkfjhd batman hjh jdjd alabama board";
var arr = ["Board of Pre University Education", "Alabama Autonomous Board", "Batman Gotham Bruce", "Superman KalEl Clark", "Board of Whatever"];
var split_input = input.split(/\s+/);
var result = [];
for (var i = 0; i <split_input.length; i++){
var exp = new RegExp('^\\b'+split_input[i]+'\\b', 'ig');
for (var n = 0; n < arr.length; n++){
if (exp.test(arr[n])){
result.push(arr[n]);
}
}
if (result.length > 0)
break;
}
由于字符串中的'batman'与数组中的一个或多个项匹配,因此不应再继续使用下一个表达式,即'hjh''jdjd''alabama''board'。 因此产生以下结果:
["Batman Gotham Bruce"]
答案 1 :(得分:0)
您不需要为每个单词包含起始锚^
,您可以使用:
var arr = ["Board of Pre University Education", "Alabama Autonomous Board", "Batman Gotham Bruce", "Superman KalEl Clark", "Board of Whatever"];
var input = "sdkfjhd board hjh alabama jdjd bat";
var split_input = input.split(' ').join("|");
var re = new RegExp("^(" + split_input + ")\\b", "i");
console.log(re);
//=> /^(sdkfjhd|board|hjh|alabama|jdjd|bat)\b/i
var result = $.grep(arr, function( a ){
return re.test(a);
});
console.log( result );
//=> ["Board of Pre University Education", "Alabama Autonomous Board", "Board of Whatever"]