我想针对20个左右的正则表达式测试给定的字符串。在Javascript中执行此操作的干净方法是什么?我更关心清晰的代码和可读性而不是效率(但我也不希望它超级慢)。
现在我有:
if (href.indexOf('apple.com') > -1 ||
href.indexOf('google.com') > -1 ||
href.indexOf('yahoo.com') > -1 ||
href.indexOf('facebook.com') > -1) {
performDarkMagic()
}
但随着名单的增长,它会开始变得那么混乱。 也许我可以创建一个正则表达式数组并执行像_.any()这样的东西并在每个表达式上应用regex.test?
编辑:要匹配的字符串/正则表达式可能会变得更复杂,我只是使用简单的URL来使示例可读。
答案 0 :(得分:7)
将测试功能用于正则表达式。
此处有关正则表达式的更多信息。 https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/RegExp
var re = /((google)|(facebook)|(yahoo)|(apple))\.com/;
re.test( str ); // returns true or false;
测试用例。
现场演示: http://jsfiddle.net/rkzXP/1/
var func = function( str ){
var re = /((google)|(facebook)|(yahoo)|(apple))\.com/;
return re.test( str );
};
test("test for valid values", function() {
equal( func("google.com"), true);
equal( func("facebook.com"), true);
equal( func("apple.com"), true);
});
test("test for invalid values", function() {
equal( func("googl.com"), false);
equal( func("faceook.com"), false);
equal( func("apple"), false);
});
因此,您可以按以下方式重写代码。
var re = /((google)|(facebook)|(yahoo)|(apple))\.com/;
if( re.test(str) ){
performDarkMagic()
}
答案 1 :(得分:3)
var patterns = ['apple.com', 'google.com', 'yahoo.com', 'facebook.com', ...]
var callFunc = false;
patterns.forEach(function(item){
if(href.indexOf(item) > -1){
callFunc = true;
break;
}
});
if(callFunc) {
performDarkMagic();
}
答案 2 :(得分:3)
是的,构建一个数组并使用.any()
或.some()
就好了,尤其是当有超过4个值时:
if (["apple","google","yahoo","facebook"].some(host => href.includes(`${host}.com`)) {
performLightMagic();
}
然而我在那里看不到正则表达式,只有字符串;所以你可以简化使用regex.test()
来:
if (/apple\.com|google\.com|yahoo\.com|facebook\.com/.test(href)) { performLightMagic(); }
甚至
if (/(apple|google|yahoo|facebook)\.com/.test(href)) { performLightMagic(); }
答案 3 :(得分:2)
你可以把每一个放在数组中然后循环遍历每个。
答案 4 :(得分:-1)
我将如何做到:将其分解为一个函数。将每个正则表达式放在一个数组中,循环遍历它们并在第一次返回true时indexOf> -1。如果到达循环的末尾,则返回false。
答案 5 :(得分:-2)
循环通过正则表达式数组,然后执行:
result=result AND (result_of_regex);
next;
循环返回结果后