Javaで文字列の最初と最後の文字以外をマスクする方法

こんにちは、さるまりんです。

プログラムを書いていて、特定の文字列は表示する際に一部を隠す必要があるものがあります。
例えば個人情報がそうですね。クレジットカード番号とかそのまま出力されるのは嫌です。

そんな時のために、単語の最初と最後の文字以外をマスクしてくれるプログラムを書いてみました。

以下のように動作します。

1. 文字列を半角スペースで分割する
2. 分割されたものの最初と最後の文字はそのまま残し、それ以外は*に置き換える

2の部分だけが必要なこともありますが今回は通しでやってくれるように実装しています。

例えばこのサイトの名称"salumarine no garage"であれば"s********e no g****e"とします。

public class MaskFirstAndLast {

    public String mask(String str) {
        // 渡された文字列strがnullもしくは空の場合はそのまま返却
       if (str == null || "".equals(str)) return str;

       // 文字列strを半角スペースで分割
       String delim = " ";
       String[] aryOfStr = str.split(delim);
       int size = aryOfStr.length;

       StringBuilder sb = new StringBuilder();
       IntStream.range(0, size)
       .forEach(idx -> {

           // 分割された文字列=単語とその長さを取得
           String s = aryOfStr[idx];
           int len = s.length();

           for (int i = 0; i < len; i++) {
               // 単語の最初と最後の文字はそのままで、それ以外は"*"にする
               if (i == 0 || i == len - 1) sb.append(s.charAt(i));
               else sb.append("*");
           }

           // 最後の単語でなければスペースを入れる(スペースで分割しているので)
           if (idx != size - 1) {
               sb.append(delim);
           }
       });

       // できた文字列を返却
       return sb.toString();
    }
}

コメントで書かれているように1&2を処理しています。

実際に使ってみます。

MaskFirstAndLast mfl = new MaskFirstAndLast();
System.out.println(mfl.mask("salumarine no garage"));
System.out.println(mfl.mask("Ludwig van Beethoven"));
System.out.println(mfl.mask("東京都 千代田区 外神田3丁目 4ー7"));

これ↑を実行するとこれ↓が出力されます。

s********e no g****e
L****g v*n B*******n
東*都 千**区 外****目 4*7

日本語の文字列でもちゃんと動作してくれました。

中身わかっちゃいます?
ある程度はこれで隠せていると思っています。
シンプルな実装ですが、これでやりたいことはできているかな。
もっと簡単にできる方法があればそれも探してみたいです。

読んでくださってありがとうございました。
それではまた!