2016-08-02 21 views
2

を使用してブラケットとアンダースコアを交換してください。は、私が<code>')'</code>と<code>'('</code>を持つ最初の下線と二下線を交換する必要があり、文字列<code>AverageLogon_Seconds_</code></p> <p>を持っているのjavascript

私はAverageLogon(Seconds)のようなテキストを取得する必要があります。

私はstr.replace(/_/g, ')');とチェックしましたが、アンダースコアiwth ')'の両方が置き換えられます。

誰でも私にこれを手伝ってもらえますか?

おかげ

+1

ループベースの方法は、多分、効率的な文字列のループと仕事を使用しますが、ないことであろう。 –

+2

グローバルフラグ 'g'を削除して繰り返します。 'str.replace(/ _ /、 '(').replace(/ _ /、 ')')' – tewathia

+0

あなたはあなたの弦のすべての出来事に** **ただ2つの括弧しか得られませんか? –

答えて

4

は、コールバックとカウンタ変数でString#replaceでそれを行います。 _を奇数の位置に(と置き換え、偶数の位置に)を置き換えます。ここで、カウンター変数を使用して位置を見つけることができます。

+1

ありがとうpranav ...しかし、私は 'str.replace(/ _ /、 '(').replace(/ _ /、 ')')'これはより完璧です –

+0

@Manu:文字列には2つの '_'しかありません....2つ以上の場合は、最初の2つだけを置き換えます....それ以外の場合は、完璧でシンプルです:) –

+0

ああ..それは..それは..いいです..現在は2それは完璧に動作します.. –

1
var str = 'AverageLogon_Seconds_', replacement = ')'; 

//replace the last occurence of '_' with ')' 
str = str.replace(/_([^_]*)$/,replacement+'$1'); 

//replace the remaining '_' with '(' 
console.log(str); 
+0

希望作品! –

-2

var str = 'AverageLogon_Seconds_', 
 
    i = 0; 
 

 
var res = str.replace(/_/g, function() { 
 
    return i++ % 2 == 0 ? '(' : ')'; 
 
}); 
 

 
console.log(res);
この作品

var t = "AverageLogon_Seconds_"; 
var ctr=0; 
while(t.contains('_')){ 
    if(ctr==0){ 
    t= t.replace('_','('); 
    ctr++; 
    } 
    else{ 
    t= t.replace('_',')'); 
    ctr--; 
    } 
} 
1

ザッツが簡単になります。ちょうど1つのライナーが必要でした。

testString = "AverageLogon_Seconds_"; 

replacedString = testString.replace(/_/, '(').replace(/_/, ')'); 

console.log(replacedString); 

出力:「AverageLogon(秒)」、全体として"_something_"パターンをターゲットに、より慎重になるように私は感じ

+1

これは2つ以上のアンダースコアの入力に対してのみ機能することに注意してください。これは即時の質問に答えるが、一般的には適用できない。 – IInspectable

3

str.replace(/_([a-z0-9 -]+)_/gi, '($1)') 

ような何かはあなたがアンダースコアの間で表示されるように期待した文字に基づいて、その[a-z0-9 -]文字クラス絞り込むことができます。今のところ、文字、数字、スペース、ハイフンがあります。

+0

これは概してより正しいように見えるため、アップアップされました。 – Vinay

1

var tests = [ 
 
    'AverageLogon_Seconds_', 
 
    'AverageLogon_Seconds_ and some other_data_', 
 
    'Oh no, too_many_underscores___'], 
 
    out = document.getElementById('out'), 
 
    rx = /_([a-z0-9 -]+)_/gi; 
 

 
tests.forEach(function(test) { 
 
    out.innerHTML += test + ' => ' + test.replace(rx, '($1)') + '\n'; 
 
});
<pre id="out"></pre>

Pranavのソリューションはいいです。私は非常に迅速に理由を説明することができます(つまり時にはあまりエレガントではないもの)を書く傾向があります。別の方法(DJキャレドの声で読んで):

function replaceUnderscores(str) { 
 
    return str.split('_').map(function (part, ind) { 
 
    if (part === '') { 
 
     return ''; 
 
    } 
 
    if (ind % 2 === 0) { 
 
     return part + '('; 
 
    } else { 
 
     return part + ')'; 
 
    } 
 
    }).join(''); 
 
} 
 

 
// "AverageLogon(Seconds)" 
 
console.log(replaceUnderscores('AverageLogon_Seconds_'));

+1

それは良いDJ Khaledの声.................. –

+0

彼らはあなたがSOの質問に答えることを望んでいない – Vinay

関連する問題

 関連する問題