17
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに 🐢

お仕事で、コピペ入力文字列の特定文字をバックスラッシュで
エスケープしたいケースがありました。
面白そうなので、放課後に取り組んでみました。
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

うまくいきました!
辞書の指定文字のみエスケープされています。

おわりに

入力がテンプレートリテラルへのコピペなので、レアケースかと思います。
でも面白かったし、私の役には立つので大満足です。

おやすみなさい!

17
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?