组合多个 /^(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 但您不匹配单词边界。因此:
- 大学预科教育委员会//委员会匹配
- 阿拉巴马州自治委员会//阿拉巴马州和委员会的比赛
- 蝙蝠侠哥谭布鲁斯 // 蝙蝠比赛
- 超人 KalEl Clark // 不匹配
- 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"]
我在尝试找出以下内容的正确正则表达式语法时遇到了一些困难:
考虑这个输入:
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 但您不匹配单词边界。因此:
- 大学预科教育委员会//委员会匹配
- 阿拉巴马州自治委员会//阿拉巴马州和委员会的比赛
- 蝙蝠侠哥谭布鲁斯 // 蝙蝠比赛
- 超人 KalEl Clark // 不匹配
- 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"]