web-dev-qa-db-ja.com

電話番号のマスキングJava

電話番号をマスクする必要があります。数字、+(国別コード)、およびダッシュで構成できます。国コードは1桁以上の数字で構成されます。最後の4を除くすべての桁をマスクするために、このような正規表現を作成しました。

inputPhoneNum.replaceAll("\\d(?=\\d{4})", "*");

そのような入力の場合:+ 13334445678

私はこの結果を得ます:+ ******* 5678

ただし、このような入力では機能しません。+ 1-333-444-5678特に、何も変更せずに同じ数値を返します。目的の出力は、最後の4つを除くすべての桁、プラス記号とダッシュをマスクしています。ダッシュを含めるように正規表現を変更するにはどうすればよいのかと思いました。私はどんな助けにも感謝します!

8
Cassie

検索にこの正規表現を使用します。

.(?=.{4})

RegExデモ

違いは.は、正規表現のように数字だけでなく、任意の文字に一致します。

Javaコード:

inputPhoneNum = inputPhoneNum.replaceAll(".(?=.{4})", "*");

ただし、意図が前のすべての数字最後の4桁をマスクする場合:

.(?=(?:\D*\d){4})

またはJavaで:

inputPhoneNum = inputPhoneNum.replaceAll("\\d(?=(?:\\D*\\d){4})", "*");

(?=(?:\\D*\\d){4})は、0以上の非数字で区切られた、少なくとも4桁先の存在をアサートする肯定的な先読みです。

RegExデモ2

12
anubhava

RegExは得意ではありませんが、-occurencesを削除して電話番号を正規化する必要があると思います。

   inputPhoneNum = inputPhoneNum.replace("-","").replaceAll("\\d(?=\\d{4})", "*");
2

2を使用してすべての非数字または+を空に置き換えてから、正規表現を使用してみてください。

"+1-333-444-5678".replaceAll("[^\\d\\+]", "").replaceAll("\\d(?=\\d{4})", "*");

出力

+*******5678
1
YCF_L

Ifregexを使用したくない場合、別の解決策は、StringStringBuilderで最後から最初までループし、最初の4桁を追加してから*その後(通常どおり数字以外の文字を追加します)

public static String lastFour(String s) {
        StringBuilder lastFour = new StringBuilder();
        int check = 0;
        for (int i = s.length() - 1; i >= 0; i--) {
            if (Character.isDigit(s.charAt(i))) {
                check++;
            }
            if (check <= 4) {
                lastFour.append(s.charAt(i));
            } else {
                lastFour.append(Character.isDigit(s.charAt(i)) ? "*" : s.charAt(i));
            }
        }
        return lastFour.reverse().toString();
    }

オンラインでお試しください!

0
achAmháin

これはうまくいくと思います

".*\\d(?=\\d{4})","*"

このウェブサイト を使用して、ヒットアンドトライアルで作成してみることができます。

0