针对 JavaScript 中的多个正则表达式测试字符串

test string against multiple regexes in javascript

本文关键字:正则表达式 测试 字符串 JavaScript 针对      更新时间:2023-09-26

我想针对 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 使示例可读。

对正则表达式使用 test 函数。

有关正则表达式的更多信息,请单击此处。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()
}
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();
}

是的,构建数组并使用 .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(); }

您可以将每个放在数组中,然后循环访问每个。

我会怎么做:把它分解成一个函数。将每个正则表达式放在一个数组中,遍历它们并返回 true 第一次索引> -1。如果到达循环的末尾,则返回 false。

遍历正则表达式数组,然后执行以下操作:

result=result AND (result_of_regex);
next;

循环返回结果后