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

时间:2015-02-19 18:35:27

标签: javascript jquery arrays regex grep

我有点陷入困境,试图找出以下正确的正则表达式语法:

考虑这个输入:

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/

2 个答案:

答案 0 :(得分:1)

正则表达式正常运行。 |作为OR工作,但你不匹配单词边界。因此:

  1. 大学预科教育委员会//董事会比赛
  2. 阿拉巴马州自治局//由阿拉巴马州和董事会匹配
  3. Batman Gotham Bruce //匹配蝙蝠
  4. 超人KalEl Clark //不符合
  5. 董事会无论//与董事会匹配
  6. {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"]

JSFiddle Demo