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