• ベストアンサー

JavaScriptでメタ文字エスケープ

JavaScriptで?や|などのメタ文字をエスケープするために\をつけるよう変換したいのですが、?を置換する場合replaceを使って\?にできたのですが例えば????や|||など連続させると\????と最初だけエスケープされます。これを\?\?\?\?のように変換するにはどうすればよいのでしょうか?また\のエスケープ方法なんかも教えてください。 説明が変で申し訳ありませんが、なかなか上手く変換できず困っています。 PS カテゴリが違いますがJavaScriptでなく、Perlで簡単に可能な場合はPerlでのやり方などもぜひご教授ください。 お願い致します。

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

  • ベストアンサー
  • suzuki-_-
  • ベストアンサー率77% (152/195)
回答No.3

#2です \マークに関しては、通常string型のリテラルとして変数に代入する場合、エスケープが必要です なので、まず変数の代入の時点で //例 変数str に ?|\ という文字列を代入させたい場合 str = "?|\\"; となります まずここがエラーの原因になっている可能性の一点目 そしてもうひとつが、RegExp内です 前回説明したようにRegExp -> replaceと渡るので"エスケープの\"を表すためにも更にエスケープが必要です jsの (\\?|\\|) とperlの (\?|\|) を比べるとわかりやすいですが、\が倍必要になるということです replace内でエスケープではない文字列の\マーク =1点目で挙げたように \\ を渡したいので、 RegExp内では\\両方をエスケープしてあげる必要があります つまり、めんどくさいことになりますが、\\\\ となるわけです 前回の内容を変えてまとめると // str = "?|\\";//= ?|\ document.write(str + " → ");//試し書き用 str = str.replace(new RegExp("(\\\\|\\?|\\|)","g"),"\\$1"); document.write(str); // となります RegExp内の(\\\\|\\?|\\|)がreplaceで(\\|\?|\|)として扱われるということです このreplaceでの扱われ方とperlでのマッチパターンの書き方が共通項となります $str =~ s/(\\|\?|\|)/\\$1/g;### 例

msak777
質問者

お礼

たびたび回答ありがとうございます。 試した結果ばっちり上手くいきました! また1つよい勉強ができました。 本当にありがとうございました。

その他の回答 (2)

  • suzuki-_-
  • ベストアンサー率77% (152/195)
回答No.2

javascriptはRegExpが用意されているのでreplaceにそちらを使うと便利です // str = "???||||?|?||"; str = str.replace(new RegExp("(\\?|\\|)","g"),"\\$1"); document.write(str); // RegExp -> replace と流れるので、RegExp内では エスケープ用の\に更にエスケープ(\\?と\\|部分)が必要になります "g"は繰り返し実行、$1は RegExp内()部分=マッチした内容の後方参照です エスケープされていない | は、複数条件用で「又は・もしくは」を意味します perlなら $str = "???||||?|?||"; $str =~ s/(\?|\|)/\\$1/g; print $str; のような感じです

msak777
質問者

補足

回答ありがとうございます。 早速試した結果見事エスケープに成功しました! 本当にありがとうございます(しかもPerlまで)。 しかしこの方法でやってみたら\マークは上手くエスケープできなかったのですが\マークは他に特別な方法でエスケープするものなのでしょうか?それとも自分のやり方が悪いのか・・・w 気が向いたぜひ教えてください。お願いします。

  • MAN_MA_RUI
  • ベストアンサー率41% (426/1024)
回答No.1

JavaScriptだとちょっと手を加えることになるようです。 http://www.altum.jp/js/41.txt

msak777
質問者

お礼

回答およびURLどうもありがとうございました。 もっと勉強し、精進します。

関連するQ&A