はじめに 🐢
お仕事で、コピペ入力文字列の特定文字をバックスラッシュで
エスケープしたいケースがありました。
面白そうなので、放課後に取り組んでみました。
JSです。
1.やりたいこと
\ や ? や ! などをバックスラッシュでエスケープする。
2.困ったこと
入力文字列にはバックスラッシュが1コで存在している。
そのまま JS に渡すと、文字列のエスケープ扱いとなってしまう。
3.どうしたか
String.raw と テンプレートリテラル を用いる。
入力時のバックスラッシュが1コでも大丈夫。
String.raw`\?!`; // '\\?!'
4.エスケープ
入力文字列を一文字ずつ分割して配列にし、それぞれに対して map でエスケープ入れる。
String.raw`\?!`.split('').map(x => '\\' + x); // ['\\\\', '\\?', '\\!']
5.分岐
特定文字のみエスケープなので、分岐を入れる。
辞書を持たせて、indexOf でマッチした場合のみエスケープする。
String.raw`h\o?g!e`.split('').map(x => (['\\','?','!'].includes(x))? '\\' + x : x);
// ['h', '\\\\', 'o', '\\?', 'g', '\\!', 'e']
6.出力
最後に、最終出力では バックスラッシュ2つではなく、1つであって欲しいので
console.log で囲ってあげます。
そうそう、join も入れて元の文字列っぽくしておきます。
console.log(String.raw`h\o?g!e`.split('').map(x => (['\\','?','!'].includes(x))? '\\' + x : x).join(''));
// h\\o\?g\!e
うまくいきました!
辞書の指定文字のみエスケープされています。
おわりに
入力がテンプレートリテラルへのコピペなので、レアケースかと思います。
でも面白かったし、私の役には立つので大満足です。
おやすみなさい!