読者です 読者をやめる 読者になる 読者になる

【processing/java】 replaceAllで"?"を置換したい

先週、発表する機会があり、そのためにprocessingでAPIを叩いていたところ2つの問題にぶち当たりました。
一つはAPIから帰ってくる文字の文字コードがなぜかSJISだったって言うことです。

文字コードの変換

なんでUTF-8じゃないんだよ!!

よくわからない文字が帰ってくるな~でも200 OK なんだよな~って思ってたのですが、

String sjisToUtf8(String value) throws UnsupportedEncodingException {
  byte[] srcStream = value.getBytes("SJIS");
  byte[] destStream = (new String(srcStream, "SJIS")).getBytes("UTF-8");
  value = new String(destStream, "UTF-8");
  return value;
}

space.geocities.jp
ココらへんの記事を参考にしながら文字コード問題は解決できたと思ったのですが、こんどはそのせいによる文字化けが起こってしましました。

文字化け(?)の置換について

(まじかよ・・・もうやだよ・・・・)
とりあえず全部、置換しちゃえ!
ってことでこんなコードを書きました。

悪い例

String hoge="?あ?い?う?え?お?";
println(hoge.replaceAll("?",""));

これを実行するとエラーが・・・・・
しかもなんだよ、PatternSyntaxExceptionって
もう意味わかんない!!
よくわかんなかったので、回避策として

一時的な回避策

String hoge="?あ?い?う?え?お?";
while (hoge.indexOf("?")!=-1) {
hoge=hoge.replace("?", "");
}
println(hoge);

よし動いた~解決~
でやってたのですが。
今回記事を書くとなって詳しく調べてみたら、?は正規表現記号で使うのでエラーを吐いてたみたいです。
よくJavadoc読んでませんでした...
正規表現使えるのなら使えそうだな、役に立ちそうだなと思い、さらにいい勉強になりました。

正しい答え

String hoge="?あ?い?う?え?お?";
println(hoge.replaceAll("\\?",""));

?の前に\\(バックスラッシュ2つ)を入れればできます。
正規表現なので、^$*+も同様にするとreplaceAllで使えます。

qiita.com

この記事が今年最後の更新になると思います。
2015年ありがとうございました。2016年もよろしくおねがいします。

                                                                                                  • -

以下 2015/12/28追記
replaceAll使わなくても行けるとの指摘を頂きました。

String hoge="?あ?い?う?え?お?";
println(hoge.replace("?",""));

すごく無駄なことをしてました・・・