1

私は正規表現を理解しようとしています。私はそれにかなり慣れていないので、ほんの数行のコードで次のことができるかどうか疑問に思っています。ここでは switch ステートメントの使用を避けようとしているので、次のことを行うというアイデアを思いつきました。

まず、これが何をするかを説明しましょう: 文字列を取得し、キーをメソッド内のローカルに既に存在する変数に置き換えます。このようなもの:

var a = 'item a',
    b = 'item b',
    string = '@a@ and @b@ have been replaced!',
    regex = /\@[a|b]\@/g;

 //now somehow replace this conditionally

 return string.replace(regex, this[replacerResut]);

出力は次のようになります。 item a and item b have been replaced!

可能かどうかはわかりませんが、その方法を知りたいです。2 つ以上のローカル変数があるので、なぜ私がスイッチを使いたくないのかがわかります。だから私はそれが間違っていることを知っています。多態的なコードを書こうとしています。ご協力ありがとうございました!

4

3 に答える 3

4

Javascript はコールバックをサポートしているため可能ですが、 1 つのオブジェクトに置換を収集する必要があります (クリーンな方法で知ることString#replaceの値を取得することはできません)。var a"a"

var replacement={
      a : 'item a',
      b : 'item b'
    },
    string = '@a@ and @b@ have been replaced!',
    regex = /\@([ab])\@/g; //note the added capturing group


 return string.replace(regex, function(whole, key){
   return replacement[key];
 });

または:

var a = 'item a',
    b = 'item b',
    string = '@a@ and @b@ have been replaced!',
    regex = /\@[ab]\@/g; 


 var replacement = {"@a@":a, "@b@":b};
 return string.replace(regex, function(whole){
   return replacement[whole];
 });

サイドノート:

正規表現はandに@[a|b]@一致しますが、. 代替 ( 、または文字グループ ( ) を使用します。これらを混同しないでください。@a@@b@@|@@(a|b)@@[ab]@

于 2013-01-30T08:37:23.153 に答える
2

ヤン・ドヴォルザークの答えは、進むべき道です。付録と同様に、彼が提供したコードは、置換オブジェクトをクロージャー オブジェクトとして使用することで、さらに「よりクリーン」replaceにすることができるため、呼び出しが返された後に GC を実行できます。

string.replace(expression, (function()
{
    var replacement = {a: 'item a',
                       b: 'item b'};
    return function(match)
    {//the actual callback
        return replacement[match];
    };
}()));//IIFE
//console.log(replacement);//undefined, can't be referenced anymore and may be flagged for GC

ここまでする必要はありませんが、JS で実際のメモリ管理を行うことはできませんが、クロージャーとスコープを使用してフラグとスイープ ガベージ コレクターに影響を与えることができます...

于 2013-01-30T08:50:15.837 に答える
1

それらがローカル変数でない場合は、次を使用して実行できますwindow(ただし、これを悪と呼びます):

string.replace(regex, function (match, group) {
    return window[group];
});

可能であれば、文字列の一致をキーとして、置換を値としてオブジェクトに入れます。

この正規表現をお勧めします:

regex = /@(\w+?)@/g;

http://jsfiddle.net/p4uvW/

于 2013-01-30T08:44:16.080 に答える