• ベストアンサー

文字列を表記する際の " や ' について

ちょっと説明しづらいのですが、例えば以下の様に、 文字列を使用する場合は " や ' で囲んで表記しますが、 var s="fnc1('fnc2(\"12345\")')"; (各関数内で setTimeout 等を使用する) さらに以下の様に、もっと文字列を囲んで使用するには、 どうすれば良いのでしょうか。(そもそも可能でしょうか?) var s="fnc1('fnc2(''fnc3('''12345''')'')')";

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

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.3

No.2のleaz024です。 >ある時は fnc1('fnc2(''fnc3('''fnc4()''')'')'); >ある時は fnc2('fnc1(''fnc4()'')'); >ある時は fnc2('fnc3(''fnc4()'')'); これ、大変ですよ!?  最初の例を使って、順を追って説明しますね。 fnc1の引数は、   'fnc2(' , 'fnc3(' , '' , fnc4() , '' , ')' , ')' と分解されてしまうので、1つの文字列にはなりません。  'で囲まれた文字列内で'を文字として使う場合、\を使ってエスケープします。(ご存知ですよね?)  つまり、次のように指定する必要があるわけです。   fnc1('fnc2(\'fnc3(\'fnc4()\')\')\');  こうするとfnc1内のsetTimeout関数からは、   fnc2('fnc3('fnc4()')') が実行されます。  するとfnc2の引数は   'fnc3(' , fnc4() , ')' と分解され、やはり文字列になりません。  文字列内の'をエスケープするには、元のfnc1の引数の方に\\をいれておく必要があるわけです。  つまり、fnc2の引数を   'fnc3(\'fnc4()\')' とするためには、fnc1の引数を   'fnc2(\'fnc3(\\\'fnc4()\\\')\')\' としておく必要があるのです。  引数として飛ばされるたびに   \\→\   \'→' と変換されるため、最初の引数にエスケープコード(\)をたくさん並べることになるのです。  つまり、更にfnc4からfnc5を呼ぶとしたら、fnc1の引数を   'fnc2(\'fnc3(\\\'fnc4(\\\\\\\'fnc5()\\\\\\\')\\\')\')\' としなければならないのです。 ね?大変でしょ!? まさしく「そんなの配列で上手く出来ないの?」です(笑)

tasahamu
質問者

お礼

すごーい!!大変だけど実際やってみるとできました!! でも確かに、決してエレガントとは言えませんね... ありがとうございます、すごく勉強になりました。 この知識は何だかすごく使えそうで、使い道ないかなぁ。

その他の回答 (2)

  • leaz024
  • ベストアンサー率75% (398/526)
回答No.2

No.1の補足を読んでの補足要求です。 >関数の中に関数を続けて使用する方法 とありますが、もう少し具体的に書いていただきたいのですが、、、  そもそも「関数の中」とは、どこを指しているのですか?呼び出し部の実引数を指定するところですか?定義した関数本体の中ですか?  「サンプルの内容を実現したいわけではない」ようなことが書いてありますが、このサンプル自体かなり"変わった"ことをしようとしているので、「こんな感じで」と言われても、結局このサンプルを実現するしかないのでは?と思えてしまいます。(私の読解力不足かもしれませんが)  tasahamuさんが実際に行いたいのは、サンプルとはどの程度違うのですか? サンプルを実現しても解決できないような問題ですか?

tasahamu
質問者

補足

お騒がせしてまして、本当に申し訳ないです!! > そもそも「関数の中」とは、どこを指しているのですか? 「呼び出し部の実引数を指定するところ」です。 > このサンプル自体かなり"変わった"ことを やっぱそうですよね。 もう少し状況を詳しく説明させて頂きますと、 Windows で動いている業務用の「デジカメプリントマシン」がありまして、 訳あってそのソフトウエアの体験版を、汎用性のある IE と NN 用として、 JavaScript で作成していたのです。 つまり「普通こんなの JavaScript で作らないよ」って位複雑だったんです。 そこで、ライブラリを作成しながら、なるべくスッキリとしたプログラムを、 作成しようとしていたのです。 もちろん、その実現自体は他の方法でも可能なのですが、ふと思った訳です。 例えば、色々な効果音(2秒とか10秒とか)を色々続けて鳴らしたい時、 画像の onload の様に1つの効果音が終了した事を知る方法がないので、 それぞれの効果音を1つ1つの関数にし、各関数内で特定の隠しレイヤーに、 <EMBED> タグを書き込み、平行して setTimeout を使用するといった方法を、 取っていたんです。 「そんなの配列で上手く出来ないの?」と言われればそれまでですが、 例えば、以下の様に出来たら便利だなと思った訳です。 fnc1(次の関数) {入金の効果音、2秒、特定の処理} fnc2(次の関数) {説明の効果音、8秒、特定の処理} fnc3(次の関数) {機械の効果音、5秒、特定の処理} fnc4(次の関数) {返金の効果音、3秒、特定の処理} ある時は fnc1('fnc2(''fnc3('''fnc4()''')'')'); ある時は fnc2('fnc1(''fnc4()'')'); ある時は fnc2('fnc3(''fnc4()'')'); また「文字列を各関数内で加工してみたら?」と言う案もあるかも知れません。 でも、これがもし可能なら便利だし勉強にもなるなと思った訳です。 説明が長くなってしまってスミマセンでした。 宜しくお願い致します。

  • shinjif
  • ベストアンサー率33% (30/90)
回答No.1

つまり、文字列として"や'を使用したいということですね。 最初の例の var s="fnc1('fnc2(\"12345\")')"; の\マークがポイントです。 "や'を本来の文字列データを囲む記号としてではなく、文字列の一部として使用したい場合はその直前に\マークを付けてください。 var s="fnc1('fnc2(\"12345\")')"; は変数sにfnc1('fnc2("12345")') という文字列が格納されます。 var s="fnc1('fnc2("fnc3("'12345'")")')"; についてですが、sに fnc1('fnc2("fnc3("'12345'")")') という文字列を格納したいのなら"の直前に\マークを付ければよいのです。 var s="fnc1('fnc2(\"fnc3(\"'12345'\")\")')" JavaScriptは文字列を囲む記号として "と'の両方が指定できますので、わかりやすくするためには'の方も\マークを付けて var s="fnc1(\'fnc2(\"fnc3(\"\'12345\'\")\")\')" とした方が良いかもしれません。\がついていることによって、これは文字列として扱って欲しいのだという意思表示になりますから・・・ ちなみに、文字列として\を指定したい時は\\と書けば大丈夫です。 \の様な働きをする文字のことを「エスケープシーケンス」「エスケープ文字」と言います。

tasahamu
質問者

補足

せっかくのご回答、大変申し訳ありません。 やっぱり私の説明が悪いのだと思います。 説明しづらいので、以下にサンプルを作りました。 <HTML><HEAD><SCRIPT LANGUAGE="JavaScript"><!-- function fnc1(s) {document.bgColor="red"; setTimeout(s,2000);} function fnc2(s) {document.bgColor="green"; setTimeout(s,2000);} function fnc3(s) {document.bgColor="blue"; /*setTimeout(s,2000);*/} var s="fnc1('fnc2(\"fnc3()\")')"; document.bgColor="white"; setTimeout(s,3000); //--></SCRIPT></HEAD><BODY></BODY></HTML> でも、さらに誤解を招きそうなので補足しますと、 決してこのサンプルが実現したい事ではなくて、 こんな感じで、関数の中に関数を続けて使用する方法を、 知りたくて困っているのであります。 (ひょっとしたら不可能な事かも知れません) 宜しくお願い致します。

関連するQ&A

  • c言語の文字列出力

    プログラミング超初心者です サイトで文字列の出力について調べていたところ c言語は変数に文字列を代入することができないのでstrcpy関数を使い以下のようにするとあります char s[5]; strcpy(s, "ABCDE"); printf("%s\n", s); ところが他のサイトでは以下のように説明しています char s[5] = "ABCDE"; printf("%s\n", s); 明らかに後者の方が簡単で良いように見えるのですが違いはなんですか? あと、文字列の配列の指定?の[5]の部分なのですが 数字を記載しているところがほとんどですが省略しているところも有ります どんな文字列が入るかわからない場合もありますがここは省略しない方が良いのですか? よろしくお願いします

  • 16表記の文字列を数字に直したい(C/C++標準関数)

    16表記の文字列を数字に直したい(C/C++標準関数) 例えば、"FF”な255 or -127という風に16表記の文字列を数字に直すC/C++の標準関数はありますか? なければ、どのようなやり方で行っていますか? VxWorksのprogramを開発しようとしているのですが、どんな標準関数が使えるのか、 直接契約していないので分かりません。 組み込み製品の説明書にはC/C++の仕様の説明書がないですね。 VxWorksでsupport されている標準関数はどんなものがあるかもご存知の方教えてください。 シリアル通信のプログラムで伝聞がASCIIで書かれていて、数値は10進だったり、16進だったりします。

  • エクセル:文字列がマッチしたものだけ、隣に表記を入れたいです

    エクセルの100行ぐらいある1列の中で、例えば、「○×△◇」という文字列があるセルのみ、その隣のセルに「記載有り」という表記が出るように、関数を作りたいと思っています。 IF・MATCHや、VLOOKUPを使えばと思ったんですけど、そんなに甘くないようで、苦戦しています。 どなたか、アドバイスいただけないでしょうか。よろしくお願い致します。

  • 文字コードによる表記

    非常に初心者的な質問なんですが、 文字コードのS-JISで「、」を表記する場合、 「0x8140」と表記するのが正しいのでしょうか? xの部分は区数を入れるのか、そもそも0xの部分は必要なのか 調べてもよくわかりませんでした。 どうかお願いします。

  • 複数列の値を条件に応じて別の列に合わせて表記したい

    エクセルで困っています。 以下、現在の表にあるように、 A列に、任意の番号 B列に、任意の番号にひもづく所属番号 があるとき、C列に上から、 B列番号を表記し、その下のセルに、 B列の所属番号が同じA列の番号をすべて順番に表記していきたいとき、 どのような関数を使えば可能でしょうか。 INDEXやMATCH、ROW等を考えてみましたがうまくできません。。。 また、もし可能でしたら、後学のために関数式の意味も 合わせて教えていただければ、大変大変助かります<(_ _)> ≪補足情報≫ ・A列の所属をVlookupでB列に表記させてあります。 ・A列の数値はA列内で重複しません。 ・A列の数値はB列の所属番号内で昇順に表記されています。 ・B列の所属番号設定数は変動します。  (以下の例では、所属番号1が3つ、2が4つ・・・ですが1が5つ等になる可能性もあります) ↓現在の表↓    A   B 1  1   1 2  10  1 3  15  1 4  2   2 5  6   2 6  8   2 7  20  2 8  3   3 9  9   3 10 18  3 ↓このようにしたいです。↓    A   B  C 1  1   1  1 2  10  1  1 3  15  1  10 4  2   2  15 5  6   2  2 6  8   2  2 7  20  2  6 8  3   3  8 9  9   3  20 10 18  3  3     ・  ・  3     ・  ・  9     ・  ・  18           ・           ・           ・ ちなみに、C列の表記はA、B列と行数が合っていなくて構いません。 マクロやVBAがわからないので、関数で教えていただければありがたいです。 何卒よろしくお願いします<(_ _)> ※エクセル2010を使用しています。

  • 文字列関数について

    よろしくお願いします。 「abcdefghijklmn」 このような文字列から dとjので囲まれた文字列「defghij」を 抜き出したい場合はどうすれば良いでしょうか? 正規表現を使用するのでしょうか? 便利な関数や方法がありましたら教えてください。 お願いいたします。

    • 締切済み
    • PHP
  • Javascriptで指定した位置の文字列を変えるにはどうしたらよいの

    Javascriptで指定した位置の文字列を変えるにはどうしたらよいのでしょうか? var s = "0123456789"; を 6番目の5をGに変更。 var s = "01234G6789";

  • カンマの含まれる文字列の数値変換方法について

    VB.NETでプログラミングしています。 String型の文字列を Double型の数値に変換するときに 一般的にはVal関数を使いますが、 カンマが含まれる文字列"111,111"を 数値変換したい場合には単純にVal関数を 使用しただけではうまくいかないようです。 上の例で数値変換すると"111"になってしまうようです。 そこで質問なのですが、 何か簡単にできるうまい方法はないでしょうか? 関数があればご教示ください。 以下、Val関数の説明の抜粋です。 解説 文字列中に数字以外の文字が見つかると、Val 関数は読み込みを中止します。円記号 (\) やカンマ (,) など、通常は数値の一部と見なされる記号や文字も、Val 関数は数値として解釈しません。

  • エクセルでの文字の表記について

    エクセルで、 A列に含まれる文字を、 C列に置き換えて表記したいのですが、 例)白い(ab) 黒い(cd) 赤い(ef) 1行目A列 白いねこ → 1行目C列に ab 2行目A列 赤い風船 → 2行目C列に ef 3行目A列 黒い犬  → 3行目C列に cd と表記したいです。 どのような方法で、どのように関数を使えば良いのでしょうか。 教えて下さい。 よろしくお願いします。

  • プログラミングで文字列のことをstringって表記

    プログラミングで文字列のことをstringって表記しますがなぜstringなんでしょうか?