6

与えられた文字列を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を使用しました。

4

6 に答える 6

8

正規表現には 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()
}
于 2012-06-06T20:05:31.227 に答える
4
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();
}
于 2012-06-06T20:06:31.717 に答える
4

はい、特に 4 つ以上の値がある場合は、配列を作成して.any()orを使用しても問題ありません。.some()

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(); }
于 2012-06-06T20:07:18.897 に答える
2

それぞれを配列に入れてから、それぞれをループすることができます。

于 2012-06-06T20:03:51.180 に答える
-1

私がそれを行う方法:それを関数に分解します。各正規表現を配列に入れてループし、最初に indexOf > -1 で true を返します。ループの終わりに達した場合は、false を返します。

于 2012-06-06T20:04:58.283 に答える
-2

正規表現配列をループしてから、次のようにします。

result=result AND (result_of_regex);

next;

ループの戻り結果の後

于 2012-06-06T20:06:20.680 に答える