• ベストアンサー

JavaScriptで正規表現と置換

タイトル通りのことをしたいのですがいまいち出来ないです。 変数 A00 = "かきくけこ"; 配列 x[0] = "あいうえおA00さしすせそ" ; 配列x[0]内の「Aと2桁の数字」を探し、該当する変数と置換する。 と言うことをしたいのです(つまりx[0] = "あいうえおかきくけこさしすせそ") x[0].match() で探すことは出来ますが .replace()の書き方が分かりません^^; どちら様か御教授よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • mrumesuke
  • ベストアンサー率45% (254/557)
回答No.3

ありゃりゃ、すいません。 間違えてしまったお詫びとして、置換対象となる文字列が2回以上出現しても全て置換するようにしてみました。 今度こそは。。。(^^A; function rep_ex(in_str) {  check_str = in_str.match(/A[0-9]{2}/g);  if (check_str) { //1個所以上マッチしたか   out_str = in_str; //出力変数を入力文字列で初期化   for (i=0; i<check_str.length; i++) { //マッチした回数ループ    //マッチした個所を一つずつ置換    document.write("<script><!--\nout_str = \"" + out_str + "\".replace(/A[0-9]{2}/," + check_str[i] + ");\n//--"+">\n</script>");   }   //変換結果を出力   return out_str;  }  //マッチしないときは入力をそのまま返す  return in_str; } 使用方法はこんな感じで。 x[0] = rep_ex(x[0]); x[1] = rep_ex(x[1]); 後はお好みに合わせて適宜カスタマイズしてください。 残る課題は存在しない変数名(A99など)にマッチした場合の処理ですが・・・これは必要に応じて追加してください。

howsike
質問者

お礼

またまたご回答ありがとうございます^^ 大変参考になります!また、お世話になるかもしれませんが、 そのときはよろしくお願いします♪

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • mrumesuke
  • ベストアンサー率45% (254/557)
回答No.4

追加情報です。 document.write~の行を次の行と差し替えてもOKです。    eval("out_str = \"" + out_str + "\".replace(/A[0-9]{2}/," + check_str[ i] + ")"); スクリプトを動的に生成するという発想自体に変更はないのですが、document.write よりはevalの方が幾分スマートかと思います。

すると、全ての回答が全文表示されます。
  • mrumesuke
  • ベストアンサー率45% (254/557)
回答No.2

なるほど、質問を読み違えていました。 ではこんな関数はどうでしょう。(全角スペースを半角スペースかタブに置換してください。) function rep_ex(idx) {  str = x[idx].match(/A[0-9]{2}/);  if (str) {   document.write("<script><!--\nstr = x["+idx+"].replace(/A[0-9]{2}/," + str + ");\n//--"+">\n</script>");  }  return str; } 使用例はこんな感じで。 A00 = "かきくけこ"; A21 = "なにぬねの"; x[0] = "あいうえおA00さしすせそ"; x[1] = "たちつてとA21はひふへほ"; document.write(rep_ex(0)+"<br>"); document.write(rep_ex(1)+"<br>"); 前提条件は、処理対象文字列の中に置換対象文字列が一つであること。  "あいうえおA00さすしすせそ"はOKですが、  "あいうえおA00さすしすせそA21はひふへほ"はNG(最初の一つしか置換しません) そこまで要求されるのか分からない上に面倒なので試してませんが、関数をいじれば対応させることも可能だと思います。(^^;

howsike
質問者

お礼

度々のご回答ありがとうございますm(_ _)m 折角ご回答なのですが、上の例では表示はOKなのですが‥‥配列x[]内は変わってないですよね^^; どうしても配列内を置換したいので‥‥試行錯誤でなんとか以下のようにしてみました。 ------------------------------------------------- //変数は諦めAも配列に‥‥ A[0] = "かきくけこ"; A[21] = "なにぬねの"; x[0] = "あいうえおA00さしすせそ"; x[21] = "たちつてとA21はひふへほ"; function rep_ex(idx) {   str = x[idx].match(/A[0-9]{2}/);   if(str) {     x[idx] = x[idx].replace(/A[0-9]{2}/,cl_word(str));   }   alert(x[idx]); } function cl_word(str){   var num = "" + str ;    //numに格納(しないとエラー?)   num = num.substring(1,3) ; //数字を取り出す   num = num - 0 ;      //数値に変換   return (A[num]) ; } rep_ex(0) ; rep_ex(21) ; ------------------------------------------------ これも前提条件は、処理対象文字列の中に置換対象文字列が一つであること。 になりますね^^; 無理やりな感じが溢れてます^^

すると、全ての回答が全文表示されます。
  • mrumesuke
  • ベストアンサー率45% (254/557)
回答No.1

いくつか書き方があります。 まず、冗長だけど基本的な書き方: x[0] = x[0].replace(/A[0-9][0-9]/,A00); これは x[0] = x[0].replace(/A[0-9]{2}/,A00); または x[0] = x[0].replace(/A\d{2}/,A00); などと記述することも可能です。 詳しくは参考サイトをご覧ください。

参考URL:
http://tohoho.wakusei.ne.jp/js/string.htm#Repl,http://tohoho.wakusei.ne.jp/js/regexp.htm
howsike
質問者

補足

ご回答ありがとうございます。 ええと、この場合だと置換されるのは必ず「A00」の変数になりますね^^; 質問の補足になるのですが置換する文字も動的に‥‥例えば、 配列内にあるのが「A00」ならA00を、 配列内にあるのが「A21」ならA21を、 のようにすることは可能でしょうか?よろしくお願いします。

すると、全ての回答が全文表示されます。

関連するQ&A