2011-09-17 7 views
4

文字列の一部を、JavaScriptで同じ数のダミー文字で置き換えようとしています。 '== Hello ==' with '== ~~~~~ == '。Javascript Regex-同じ文字数の別の文字で文字の並びを置換する

この質問はPerlPHPを使用して回答しましたが、JavaScriptで動作させることはできません。

txt=txt.replace(/(==)([^=]+)(==)/g, "$1"+Array("$2".length + 1).join('~')+"$3"); 

パターンマッチが正常に動作しますが、交換はしていません - 第二部が追加されます「~~」の代わりにパターンマッチの長さの:私はこれをしようとしてきました。 "$ 2"をかっこ内に入れても機能しません。適切な文字数を挿入するにはどうすればよいですか?

+0

関連/デュープ:http://stackoverflow.com/questions/7337995/regex-replace-sequence-of-one-character-with-same-number-of-another-character – blahdiblah

答えて

5

ではなく、交換のための機能を使用します。

var txt = "==Hello=="; 
txt = txt.replace(/(==)([^=]+)(==)/g, function ($0, $1, $2, $3) { 
    return $1 + (new Array($2.length + 1).join("~")) + $3; 
}); 

alert(txt); 
//-> "==~~~~~==" 
0

working sampleは、次のコード使用しています:

var processed = original.replace(/(==)([^=]+)(==)/g, function(all, before, gone, after){ 
    return before+Array(gone.length+1).join('~')+after; 
}); 

をあなたのコード内の問題は、あなたが常に"$2"(常に文字列の長さを測定したということでした2文字で)。機能を持つことで、一致した部品の長さを測定することができます。さらなる例については、documentation on replaceを参照してください。

+0

あなたコードはそれにわずかなエラーがあり、1文字を予想よりも少なく返します。これは、同じ長さの置換文字列を生成するには、配列の長さを 'join()'の文字列長よりも1長くする必要があるからです。 –

+0

ヒントのためにありがとう。コードが修正されました。 –

0

$ 2置換の前にlength属性が評価されているので、replace()は機能しません。 Augustusによって提案された関数呼び出しがうまくいきません。もう一つの方法は、replace()の代わりにmatch()を使う方法です。

/gを指定せずにmatch()を使用すると、期待通りに結合できる一致結果の配列が返されます。

txt="==Hello=="; 
mat=txt.match(/(==)([^=]+)(==)/); // mat is now ["==Hello==","==","Hello","=="] 
txt=mat[1]+Array(mat[2].length+1).join("~")+mat[3]; // txt is now "==~~~~~==" 

あなたは真ん中の式から先頭/末尾の文字を除外していますが、より多くの柔軟性をしたい場合は、これを使用すると先頭/末尾のリテラルで囲ま何でも扱うことができます。純粋な正規表現のための

mat=txt.match(/(^==)(.+)(==$)/)