• ベストアンサー

replaceで文字列結合、もしくはエスケープを

文字列から「| goo」を削除したいです。 直接書くとうまくいくのですが、 変数に入れるとうまくいきません。 どう書けば良いのでしょうか? <うまくいく> var hoge="教えて | goo"; hoge = hoge.replace(/ \| goo/,""); document.write(hoge); <うまくいかない> var osiete="goo"; var hoge="教えて | goo"; hoge = hoge.replace(/ \| osiete/,""); document.write(hoge); <うまくいかない> var osiete="goo"; var hoge="教えて | goo"; hoge = hoge.replace(/ \| +osiete/,""); document.write(hoge);

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4856/10272)
回答No.1

replaceの第一引数には正規表現だけで無く文字列も書けるので、 var osiete="goo"; var hoge="教えて | goo"; hoge = hoge.replace(" | "+osiete,""); 正規表現の一部に変数を使いたいと言うことなら、 var osiete="goo"; var hoge="教えて | goo"; hoge = hoge.replace(new RegExp(" \\| "+osiete),""); この場合、正規表現のためのエスケープと、文字列としてのエスケープで \ は2つ書きます。

re999
質問者

お礼

回答ありがとうございました。 両方とも期待通りに動作しました。 大変勉強になりましたー

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

関連するQ&A

  • 文字列とエスケープ

    http://oshiete1.goo.ne.jp/qa3611556.html よく考えたらこれは不完全です。 $teststr ='";alert("あいう");var hoge ="'; とか書かれる可能性があるわけで。 エスケープの手段にはどのようなものがあるでしょうか?

    • ベストアンサー
    • PHP
  • 変数内のURL文字列を置換させたい

    変数に格納した文字列のうち、URLを以下のようにして 置換しようとしましたが、置換されませんでした。 $html = str_replace("www.sample.com/hoge", "hoge.hogeoge.net", $html); str_replace の使い方が間違っているのでしょうか。 どうぞ宜しくお願い申し上げます。

    • ベストアンサー
    • PHP
  • document.writeの文字列が実行されるタイミング

    javascriptで<script>タグの表示をdocument.writeで行ったところ、 直後に、<script>ソースの関数呼び出しでリンク切れになったのですが、 なぜでしょうか。 document.writeの文字列が実行されるタイミングっていつなんでしょうか。 <script> document.write('<script type="text/javascript" src="hoge.js"></script>'); hoge(); </script> ※hoge()はhoge.js内で定義されています。

  • PHPの文字列の比較について

    PHPの文字列の比較について質問です。 $hoge = "文字列¥¥テスト"; $foo = "文字列¥テスト"; とあった場合 var_dump($hoge == $foo); とすると trueがかえってきます。 バイト列としてみた場合 エスケープしたバックスラッシュと 構文上、エスケープの必要のないバックスラッシュの文字列上の 比較ですがこれが、なぜかtrueがかえってきます。 これは、当然の結果なのでしょうか? PHPは文字列を比較するさい、バイト列としての文字列のならびより アウトプットされる結果を比較しているということでしょうか? それとも、単純に上記変数$hogeと$fooはバスックスラッシュの使用方法は 関係なく同一のものとして扱われるのでしょうか?

    • 締切済み
    • PHP
  • 変数に入れた文字列をindexOfで解釈したい

    すみません、質問したいと思います。 自身のURLを参照して、それを変数に格納し、その文字列中にある #の位置をindex.Ofで解釈したいと思います。 なので、以下のようなjavaScriptを書いたのですが、うまくいきません。 なぜでしょう、よければ教えてください。 <script language=javascript> var loc = this.window.location; var sharp_pos = loc.indexOf("#");//#がなければ-1を返す document.write(loc); </script> 以上のものを実行したら、URL中の#の位置がブラウザ上で数字で 確認できると思ってたのですが・・・。 javascriptって、変数に格納した文字列は解釈できないのでしたっけ? perlだったら出来てたような気がしますが・・。 本を見たら、直接文字列をいじっているサンプルしかありませんでした。  "abcde".indexOf("c"); ⇒2を返す よろしくお願いします。

  • replace()での文字列置換について

    お世話になります。 replace()で文字列置換をするとき、 sentAry=new Array("aabb()c()bbc","・・・", sent=sentAry[0]; で、 sent=sent.replace("()","(   )") と、すると、 sent="aabb(   )c()bbc;" と、なることを期待したのですが、 sent="aabb(   )c(   )bbc;" と、なってしまいました。 つまり全ての()が(   )に変換されてしまいました。 マッチングした全ての文字列か、マッチングした最初の一つだけか が、グローバル検索のg属性と、いうものにより異なるというような記載を見つけましたが、 だからと、いってどのようにすればよいのか 一向にわかりません。 どなたか、わかる方見えましたら、よろしくご教示お願いします。

  • ユニークな文字列を順次, 生成する関数

    C++において, 適当な文字列を元に, ユニークな文字列を順次, 生成する関数を作りたいと思っています. (LISPで云う, 関数gensym()と似た役割を持つ関数です.) 例えば, "hoge"というstringを元に, "hoge0", "hoge1", "hoge4", "hoge8", "hoge100", ...., といったように, stringが互いに重複しないように, 適当な数字を連結した文字列を順次生成したいのです. 以下のように, 私なりの方法を考えてみたのですが, これだと, 今まで生成したstringを保存するhoge_setが必要になります. 何かより良い(シンプル, 効率的な)方法がありましたら, 教えていただけますでしょうか? よろしくお願い致します. (乱数を用いた方法) 1. 元となるstring型の変数nameを, "hoge" で初期化. 既に作成したstring文字列を保存する, set < string > hoge_setを宣言. 2. 乱数を生成し, それをnameにappendしたものを, string型の変数name2に代入. 3. 同じ文字列が存在したら, 2. に戻る. 同じ文字列が存在しなかったら, hoge_setに追加する.

  • replaceが再帰的に実行されない

    ファイル名に使えない半角文字を、対応する全角文字に置き換えるコードを作っています。問題自体は別の方法で解決済みですが、最初に想定した方法がうまくいかなかった理由が分からないので、納得する答えを得る為に質問させて頂きます。以下のようなコードを書きました。 var target = "\\/:*\"<>|\\/:*\"<>|"; var RENAME = [   [ "\\", "/", ":", "*", "?", "\"", "<", ">", "|" ],   [ "¥", "/", ":", "*", "?", "”", "<", ">", "|" ] ]; for (var i=0, l=RENAME[0].length; i<l; i++) {   target = target.replace(/RENAME[0][i]/g, RENAME[1][i]); } alert(target); 変数target内には、ファイル名に使えない文字「\/:*?"<>|」を2回記述しています。この文字列がすべて全角文字に置き換わっていて欲しいのですが、うまくいきません。まず target = target.replace(/RENAME[0][i]/g, RENAME[1][i]); が次のようになっている場合 target = target.replace(RENAME[0][i], RENAME[1][i]); これは本当に単純な1回のみの文字列置き換えなので、前半の文字のみ全角に置き換えられ、後半の文字はどれも半角のままです。結果は「¥/:*”<>|\/:*"<>|」でした。ですので、 target = target.replace(/RENAME[0][i]/g, RENAME[1][i]); というように前後を/で囲み、オプションでgをつけることで置き換えが再帰的に行われ、後半の文字も全角に置き換わることを期待したのですが、今度は置き換えが全く行われず、変数target内の文字はすべて半角で「\/:*"<>|\/:*"<>|」のままでした。 この書き方にはどのような問題があるのでしょうか?

  • 文字列変数で行端のスペースの個数を知りたい

    Excelのマクロで文字列の入った変数があります。 文字列の最後は必ず1個以上のスペースが付いていますが、最大7個続いている時もあります。 このスペースが何個か?を出したいです。 こういう場合、Right関数やReplace関数と繰返し構文を合わせて個数を数えていくのでしょうか。 それとも一発で数が出せる関数などが有るでしょうか。

  • 「?」の入った文字列置換を、RegEx.Replaceで行いたい

    WSHを使い、あるhtmファイルの中にある特定の文字列を、RegEx.Replaceを使って置換しようとしています。通常の文字列置換についてはなんとか成功しているのですが、下記のケースで壁に当たっています。前に進める為にはどうしたらよいか、ヒントをご存知の方がいれば大変有り難く思います。 今回作業の特徴としては 1)置換前の文字列の中にメタキャラ「?」が含まれており、 2)置換前の文字列は、DBから読み込んできた文字列である の2点です。(ちなみに1だけでは成功しているのですが、1と2が組み合わさると上手くいきません) 具体的には、下記のサンプルで置換前の文字列を url_before = "test.asp\?param=999" (?についてはエスケープ文字付与) のように明示的に書いてやると置換に成功しました。ところがDBから取得してきた文字列で置換をしようとしても失敗となります。 たとえばrs.fields("item")の中身が"test.asp?param=999"だったとして、先ほどの箇所を url_before = replace(rs.fields("item"), "?", "\?") とすると、置換されないのです。 '----- サンプル ----- Set fso = CreateObject("Scripting.FileSystemObject") Set regEx = New RegExp Set inFile = fso.OpenTextFile("c:\hoge\test1.htm") Set outFile = fso.CreateTextFile("c:\hoge\test1_wk.htm") ◆動くケース:url_before = "test.asp\?param=999" ◆動かないケース:url_before = replace(rs.fields("item"), "?", "\?") url_after = "test_999.htm" regEx.pattern = url_before repStr = url_after Do Until inFile.AtEndOfStream tempLine = inFile.ReadLine repLine = regEx.Replace(tempLine, repStr) outFile.WriteLine repLine Loop inFile.Close outFile.Close