[Apex]エスケープ文字を置換する

apexにて取得した文字列から、エスケープ文字である、 \ を取り除きたかったので、置換してみた。

replaceAll

replaceAllを使用すれば全置換が出来るのだが、以下のように指定してしまうと ' をエスケープしていることになるのでプログラムが破綻してエラーになっていまう。

1
hoge.replaceAll('\', '');

エラー : line breaks not allowed in string literals

なので、エスケープ文字をエスケープしてやればいいのでは、と思ったが、これだとエラーが出てしまった。

1
hoge.replaceAll('\\', '');

エラー : System.StringException: Invalid regex: Unexpected internal error near index 1 \ ^

正規表現が間違ってますよ、というような感じ?

なので、正規表現として指定してやればいけた。

1
hoge.replaceAll('\\$', '');

以上。
以下、蛇足。

なぜ必要になったか

以前書いた、LaravelのSF接続用パッケージのforrestを利用してデータの送信を行っていたのだが、
通常の配列のパラメータを送るのは問題なく出来ていたのだが、カスタムエンドポイントにJSONのデータをbodyに入れて送信するとapex側でパースエラーが出てしまった。
JSONデータは以前書いた方法でパースしている。
ApexでJSONをパースする

その内容が、上記のエスケープ文字がJSONデータに混ざり込んでいたため、だった。
なら、JSONデータからエスケープ文字を取り除いてやればよいのでは、と思い調べると、以下のようにJSONをエンコードするとエスケープされない事がわかった。

1
json_encode($hoge, JSON_UNESCAPED_SLASHES);

第二引数にJSON_UNESCAPED_SLASHESを指定してやるだけでよい。
しかし、これを行ってもエスケープ文字が消えない。これはもしかして、ライブラリ側でエスケープをしているのでは、と思いコードを確認するとやはり以下の箇所でbodyに指定された値にjson_encodeをかけており、ここでは第二引数には何も指定されていなかった。

https://github.com/omniphx/forrest/blob/master/src/Omniphx/Forrest/Client.php#L775

ならば、設定ファイルでフォーマットの形式を指定する箇所があったので、そこでnoneを指定してやった。

https://github.com/omniphx/forrest/blob/master/src/config/config.php#L50

しかし上記のjson_encodeしている箇所をよくみるとわかるのだが、フォーマットが指定されていない場合は、body空にして送るようになってしまっていた。

これは、必ずエスケープするという方針によるものなのか、単なる実装し忘れなのかわからないが、パッケージの中身を触るわけにもいかず
(オーバーラップして自分で実装し直すのも面倒なので)
apex側で置換してやったほうがよさそう、ということで本エントリー内容を試すこととなった、という顛末。

参考

   このエントリーをはてなブックマークに追加