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

Combine multiple /^(xyz)/ regex expressions

我在尝试找出以下内容的正确正则表达式语法时遇到了一些困难:

考虑这个输入:

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',棋盘会找到一个匹配项并产生 2 个结果:["Board of Pre University Education", "Board of Whatever"]。现在,当它找到 1 个或多个匹配项时,它不应移动到下一个表达式,即 'hjh'、'alabama'、'jdjd' 或 'batman'。希望它更清楚,谢谢!

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

PS: 这是一个 fiddle http://jsfiddle.net/4h26vLq8/40/

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

  1. 大学预科教育委员会//委员会匹配
  2. 阿拉巴马州自治委员会//阿拉巴马州和委员会的比赛
  3. 蝙蝠侠哥谭布鲁斯 // 蝙蝠比赛
  4. 超人 KalEl Clark // 不匹配
  5. Board of Whatever // 按董事会匹配

'i' 作为 new 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"]

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

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 Demo