2009年4月30日木曜日

replaceの検索結果をさらにreplaceする。

JavaScriptのreplaceの置換文字列のところにfunctionを書けるよ、という話。
replace - MDC

例えば、テキスト内の「1000円」「2000円」といった数字全てにカンマを入れたいという場合
function plusCamma(str){
str = str.replace(/([0-9]+?)(?=(?:[0-9]{3})+$)/g , '$1,');
return str;
};

var text="2009年お正月セール、当店平日価格23000円の品、特価9999円!";
text=text.replace(/[0-9]+(?=円)/g, plusCamma);
alert(text);
と書ける。


置換文字列のfunctionに引数の()は入れない。
でもそれだと、検索結果全体にしか変換をかけられない。
キャプチャした$1、$2なんかを利用したい時はどうすればいいんだろう?

そう思って調べてみた。
ExtendScript Toolkitで、$.writelnを使ってコンソールに出してみる。
function test(str){
var ary=[];
for(var i=0;i<arguments.length;i++) ary.push(arguments[i])
$.writeln("数:"+arguments.length+"、引数:"+ary.join(" || "));
return "<変換済み>";
};

var text="2009年お正月セール、当店平日価格23000円の品、特価9999円!";
text=text.replace(/([0-9]+)(円)/g, test);
$.writeln(text);

結果はこんな風。
数:5、引数:23000円 || 23000 || 円 || 18 || 2009年お正月セール、当店平日価格23000円の品、特価9999円!
数:5、引数:9999円 || 9999 || 円 || 29 || 2009年お正月セール、当店平日価格<変換済み>の品、特価9999円!
2009年お正月セール、当店平日価格<変換済み>の品、特価<変換済み>!
undefined


argumentsの中に順番に、$0、$1、$2、検索された文字の位置、置換される前のテキスト全体が入って来てる。
なので$1を使いたい場合は、arguments[1]を拾えば良い。

function plusCamma2(str){
var str=arguments[1];
str = str.replace(/([0-9]+?)(?=(?:[0-9]{3})+$)/g , '$1,')
+arguments[2];
return str;
};
var text="2009年お正月セール、当店平日価格23000円の品、特価9999円!";
text=text.replace(/([0-9]+)(円)/g, plusCamma2);
alert(text);
のように書いても良い。という事。

0 件のコメント: