组合多个/^(xyz)/regex表达式

Combine multiple /^(xyz)/ regex expressions

本文关键字:regex 表达式 xyz 组合      更新时间:2024-01-21

我有点纠结于为以下内容找出正确的正则表达式语法:

考虑这个输入:

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

我认为,如果左条件为true,则将多个^(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"不会产生任何结果,所以它转到"板",板找到匹配项并产生2个结果:["Board of Pre University Education", "Board of Whatever"]。现在,当它找到1个或多个匹配时,它不应该移动到下一个表达式,即"hjh"、"labama"、"jdjd"或"batman"。希望它更清楚,谢谢!

如有任何帮助,我们将不胜感激。谢谢:)!

附言:这是一把小提琴http://jsfiddle.net/4h26vLq8/40/

正则表达式可以正常工作。|起OR的作用,但您不匹配单词边界。因此:

  1. 大学预科教育委员会
  2. 阿拉巴马州自治委员会
  3. 蝙蝠侠哥谭布鲁斯//蝙蝠比赛
  4. 超人卡莱尔·克拉克//不匹配
  5. 董事会

new RegExp中的第二个参数"i"表示不区分大小写的正则表达式。

您可以使用单词边界''b只匹配整个单词:

var split_input = input.split(' ').join("''b)|^(''b");
var re = new RegExp("^(''b" + split_input + "''b)", "i");

对于单词general match,而不仅仅是第一个单词,您可以从正则表达式中删除^:

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"]

您不需要为每个单词包含起始锚^,您可以使用:

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"]

JSFiddle演示