1

現在、私はこのようなコードを持っています..

var result = line.match( some regexp );
  if (result !== null) {
      return callback({ a: 'aaaaa', b: bvariable });
    });
  }

var result = line.match( some other regexp );
  if (result !== null) {
      return callback({ d: 'ddddd', c: bvariable });
    });
  }

私はこれらすべての正規表現とコールバックが異なる約10を持っており、リストは大きくなります。これを行うためのより良い/よりクリーンな方法はありますか?

4

5 に答える 5

1

正規表現とコールバックを「連想配列」(オブジェクト)にリファクタリングしてから、残りを一般化することができます。

var regexs = { 
    regex1: {
        regex: /./,
        callback: function () {
            // callback stuff here
        }
    },
    regex2: {
        regex: /[a-z]/,
        callback: function () {
            // callback stuff here
        }
    }
};

var result = line.match(regexs.regex1.regex);
if (result !== null) {
    return regexs.regex1.callback();
}
于 2012-09-21T13:04:26.563 に答える
1

ペアの連想配列を作成します。各ペアの最初の要素は正規表現で、2番目はコールバックです。配列をループして正規表現を照合します。一致するものがある場合は、コールバックを呼び出します。

var assoc = [
    { r: /\d+/, f: function (m) { console.log(m[1]); } },
    { r: /\w+/, f: function (m) { console.log(m[2] + m[3]); } }
];

for (var i = 0; i < assoc.length; i++) {
    var m = line.match(assoc[i].r);
    if (m) {
        return assoc[i].f(m);
    }
}
于 2012-09-21T13:05:08.137 に答える
0

検討:

input = "foo bar baz"
regexes = [
    /aa/,
    /ba./,
    /quux/,
]

regexes.some(function(re) {
    if(re.test(input)) {
        // do stuff
        return true;
    }
    return false;
})

match返されるものを実際に使用しない限り、必要ないことに注意してください。

于 2012-09-21T13:25:27.447 に答える
0

結果変数を取り除くことができます

if(line.match( some regexp )) {
  return callback({ a: 'aaaaa', b: bvariable });
}

if(line.match( some other regexp )) {
  return callback({ d: 'ddddd', c: bvariable });
}

一致関数は常にnullまたは配列を返すため、一致が失敗した場合、返されたnullはfalseにキャストされ、一致が成功した場合は、返された配列(要素の数に関係なく)がキャストされると想定しても問題ありません。本当に。

于 2012-09-21T13:33:55.023 に答える
0

正規表現パターンが単純な文字列であり、最初のパターンを2番目のパターンの前に一致させたい場合は、次のことができます。

var pattern1='aaa',
    pattern2='bbb',
    RE=new RegExp('('+pattern1+'|'+pattern2+')'); // matches pattern1 OR pattern2

if(line.match(RE)){
    var result=RegExp.$1; // content of first pair of capturing parens
    if(result===pattern1) {
        return callback(/* args specific to first pattern */);
    }
    else if(result===pattern2){
        return callback(/* args specific to second pattern */);
    }
    else {
        return callback(/* args for no match */);
    }
}
于 2012-09-22T04:42:38.873 に答える