2016-10-10 14 views
0

ドル記号間のテキストのマッチングを置き換えようとしています。正規表現でマッチを置き換えます

$match$Some text and $some text that matches$.のテキストを置き換える必要があります。

私はこの作品

text.replace(/\$.*?\$/g, function (match) { 
    return '_' + match + '_'; 
} 

を試してみました。問題は、この関数内のマッチを評価したいと思うことですが、評価が機能しない場合があります。この場合、元のマッチを返すだけです。だから、

text.replace(/\$.*?\$/g, function (match) { 
    try { 
    return evaluate(match); 
    } catch (e) { 
    return match; 
    } 
} 

のようなものです。しかし、私の現在の正規表現で、マッチが元のテキストからドル記号が含まれています。私はそれがドル記号を省略することを望むが、評価が失敗すれば、私はドル記号を元に戻したい。私は何ができるか

text.replace(/\$.*?\$/g, function (match) { 
    try { 
    return evaluate(match.replace(/\$/g, '')); 
    } catch (e) { 
    return match; 
    } 
} 

ですが、それは、よりエレガントな方法で可能ではないでしょうか?

+1

try..catch以外にも、エラーをスローするのではなく、 'evaluate'関数から何かを返そうとするべきです。 – adeneo

答えて

1

このような何かがあります

const evaluate = function(str) { 
    if (str && str.startsWith("t")) {return str.toUpperCase();} 
    throw "Gotta hava a 'T'"; 
}; 

"ab$test$cd $something$ that is $tricky$.".replace(/\$([^$]*)\$/g;, function(str, match) { 
    try { 
     return evaluate(match); 
    } catch(e) { 
     return str; 
    } 
}); //=> "abTESTcd $something$ that is TRICKY." 

しかし、私はあなたがより良いevaluateから、むしろこのような場合のために投げるよりも、(undefinednull?)異なる信号を返すかもしれないとのコメントに同意します。そして、関数本体は、単にのようなものが考えられます。/\$([^$]*)\$/g;、置換機能のパラメータとなる:

 return evaluate(match) || str; 

点は、正規表現でキャプチャグループです。

関連する問題