【问题标题】:test string against multiple regexes in javascript针对 javascript 中的多个正则表达式测试字符串
【发布时间】:2012-06-06 20:02:11
【问题描述】:

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

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    对正则表达式使用测试函数。

    更多关于正则表达式的信息在这里。 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()
    }
    

    【讨论】:

    • 哦,对不起,这是给 qunit 的。但这不是必需的。让我把它拿出来。
    【解决方案2】:
    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();
    }
    

    【讨论】:

    • forEachftw +1 /me 等待人们警告它在 IE 中不起作用.. le sigh.
    • @Bergi 你为什么要反对?它是一个比您提供的解决方案更优雅的解决方案。它看起来与操作的差别不大。
    • @Loktar:因为 OP 需要 some()!
    • @HunterMcMillen: some() (就像我的回答一样)。仔细阅读 OP 的表达是什么意思。你的代码做了一些完全不同的事情。
    • 啊,我现在明白了。 @Bergi 你应该把它放在原来的地方:P。您的 func 将继续运行 @hunterMcMillen 而 some 将停止并且不会继续执行。触摸@Bergi。
    【解决方案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(); }
    

    【讨论】:

    • 列表越大,这将很快变得失控和丑陋。
    • 嗯,它比数组表示法更简写。当然,一切都取决于该对象的可重用性......
    • 是的,尽管他说他必须针对 20 个左右进行测试。 IMO 数组是看起来更简洁的方法。
    • 我从来没有说过它不会 :-) 而对于独立的正则表达式,正如他所提到的,数组将更容易构建。
    【解决方案4】:

    你可以把每一个放在数组中,然后循环遍历每一个。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        遍历一个正则表达式数组,然后执行:

        result=result AND (result_of_regex);
        
        next;
        

        循环后返回结果

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-15
          • 2010-12-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-11
          • 1970-01-01
          • 2016-01-24
          相关资源
          最近更新 更多