No Programming, No Life

プログラミング関連の話題や雑記

JavaScriptの文字列のエスケープ

仕事でJavaScriptの文字列をエスケープするロジックを
Javaで書く機会があった。

JavaScriptの文字列は文字列の中にダブルクォート(")や
シングルクォート(')があると、それ自体が文字列構成構文要素
となるため、重なる場合、バックスラッシュ(\)でエスケープ
してあげる必要がある。

例) JavaScriptの変数宣言

   // ダブルクォートで囲む場合
   × var str = "He said "I'm not a programmer."";var str = "He said \"I'm not a programmer.\"";
   ○ var str = "He said \"I\'m not a programmer.\"";

   // シングルクォートで囲む場合
   × var str = 'He said "I'm not a programmer."';var str = 'He said "I\'m not a programmer."';
   ○ var str = 'He said \"I\'m not a programmer.\"';

この例のように

" → \"
' → \'

とエスケープします。


ということで、Javaで変換するテストのクラスのソースは
こんな感じになった。

class Esc{
   public static void main(String[] args){
      String msg = "He said \"I'm not a programmer.\"";
      System.out.println(msg);

      // ダブルクォートをエスケープ
      String escMsg = msg.replaceAll("\"", "\\\\\"");
      System.out.println(escMsg);

      // シングルクォートをエスケープ
      escMsg = escMsg.replaceAll("'", "\\\\'");
      System.out.println(escMsg);
   }
}

出力結果

>javac Esc.java

>java Esc
He said "I'm not a programmer."
He said \"I'm not a programmer.\"
He said \"I\'m not a programmer.\"

Java自体も文字列中にダブルクォートがある場合は
エスケープしないといけないからバックスラッシュの数が
わけわからなくなりそうです。