me44.org

Top > 管理人のメモ帳

000021: replaceAll の使い方 Android java String#replaceAll()

最終更新:2016/03/10

サンプル Androidのファイル名に使えない文字を除去する

String#replaceAll(String regexp, String string) で使えない文字を除去す。
Androidでファイル名に使えない文字は以下の9個らすい。
<  >  ;  *  ?  "  /  \  |
メソッド(説明用)
   public String cutIllegalCharAsFileName(String fname) {
  if(fname == null || fname.length() == 0) return "";
  return fname.replaceAll("<","")
     .replaceAll(">", "")
     .replaceAll(";", "")
     .replaceAll("\\*","")
     .replaceAll("\\?","")
     .replaceAll("\"", "")
     .replaceAll("/","")
     .replaceAll("\\\\", "")
     .replaceAll("\\|","");
}
追記2016/03/10
メソッド(エレガント版)
初版(説明用)を書いた後すぐに気づいたのぢゃが、エレガント版でよさげ。
初版の方は消そうと思ったが、説明用として残しておくととすた。
   public String cutIllegalCharAsFileName(String fname) {
  if(fname == null || fname.length() == 0) return "";
  return fname.replaceAll("[;\\*\\?\"/<\\\\>\\|]", "");
}
呼び出し
   String strDummy = "a|bc1;23*45\"6?78;9\\ABC;DEF|*GH\"I";
String strDummy2 = cutIllegalCharAsFileName(strDummy);
Log.d("Debug", "result = " + strDummy2);
実行結果
   03-10 16:15:38.292 29823-29823/? D/Debug: result = abcdef123456789ABCDEFGHI

んまぁ、ご他聞に漏れず、特殊文字絡みなのでエスケープ文字(この場合はバックスラッシュ)をどう使うかがポイントぢゃ。
String#replaceAll(String regexp, String string)は第1匹数が正規表現なので、エスケープ処理が2段階発生す。つまり、

・Androidコーディング上のエスケープ指定
・正規表現上のエスケープ指定
ぢゃ。
< 、> 、;  / についてはエスケープ不要
" についてはAndroidコーディング上、
* 、? 、| については正規表現上、
\ については両方でのエスケープ指定が必要。
といふことで、上記のメソッドになった次第。

本ページをご覧の御仁にはおそらく以上の説明で十分と思われるが、も少し続けてみよう。
エスケープ処理(文字)とは「1つ後ろの文字が持つ特別な意味を無効にして単なる文字として扱わせる」処理ぢゃ。 例えば、アスタリスクは正規表現では「直前の文字の0回以上の繰り返し」という意味を持つ。この特別な意味を無効にして 「アスタリスクという文字」として取り扱わせるのが「エスケープ処理」である。 正規表現のエスケープ文字(処理)はバックスラッシュ(を前につける)ぢゃ。なので
「アスタリスクという文字」の正規表現は
  \*
となる。これを単純にreplaceAllの第1引数にぶち込むと
string.replaceAll("\*","")
になるが、お次は「Androidコーディング上のエスケープ処理」を考えなければならぬ。 文字列の指定は、ダブルクォートでくくるのだが、バックスラッシュは特別な意味を持つ。 文字列に改行コードやタブコードを指定するのに
"abc\ndef"  改行  \n
"abc\tdef"  タブ  \t
とするぢゃろう?
このバックスラッシュの特別な意味を無効にするにはバックスラッシュをつけなければならぬのだ。 (ちなみに文字列にダブルクォートを含める場合にバックスラッシュをつけなければならぬのも同じ理屈。 「文字列指定の終わり」というダブルクォートの特別な意味を無効にしている)
結局「文字列stringから全てのアスタリスクを除外する」には
  string.replaceAll("\\*","")
と唱える。
あとはAndroidでファイル名に使えない文字9個についてエスケープ処理の要否を考えてできたのが上記メソッドということぢゃ。


管理人のじぃやへメール

時報機能付きデジタル時計作りますた。
  ・iOS 7 がサポートする全フォント(200種以上)使用可能。(iOS版)
  ・じいやが厳選したフリーフォント&Sofia Pro Soft全書体をビルトイン(Android版)
  ・5つのサウンドファイルセット
    (デジタル時計、鳩時計、ボイス、教会の鐘、Whittingtonチャイム)
  ・全ビルトインサウンド、OSのボリューム調整とは別立て
   ボリューム指定可能(iOS版5段階、Android版3段階)
  ・お手持ちの音声やフォントファイルを外部ソースとして使用可能(Android版)

    SignalClock    Android app on Google Play   無料
    SignalClock   
    SignalClock Lite      無料
アラームではなく、ローカル通知センター機能ベースです。アラームは「止める」操作を
しないと鳴り続けるので、デスクに置いて離席しその時に鳴り出すと周囲が迷惑しますが、
本アプリはその心配がありません(1回鳴って終わるだけですので、長い音でも約20秒で
止まります)。
・アラームにするほどではないが電話やタブレットが近くにある時にちょいと時刻が知りたい。
・仕事のペース配分
などに便利でつ。


こちらは、簡易テキストエディタです。
Twitterの下書き、ちょっとしたメモを保存しておくのに便利です。

    Texpalle      iPad専用 無料
    Texpalle    Android app on Google Play   試使用無料
一応、以下の機能がくっついております。
・矢印キー(選択範囲調整機能付)
・Undo / Redo
・行番号表示(Android版はボタン操作)
・文書内検索
・フォント設定(Android版は外部フォントも使用可)
・画面背景色設定(iPad版のみ)
・大文字小文字、半角全角変換(Android版のみ)
・タブコード入力
・全角スペース入力ボタン(Android版のみ)
・サブメニュー操作なしのペースト処理


Copyright © me44.org All rights reserved