Verstecke bestimmte E-Mail-Zeichen

Sep 05 2020

E-Mail-Zeichen ausblenden:

  1. Wenn E-Mails nur einen Buchstaben haben, bedecken Sie diesen Buchstaben einfach mit dem *Symbol, z*@gmail.com

  2. Wenn die E-Mail zwei Buchstaben enthält, decken Sie den zweiten Buchstaben mit dem Symbol * ab, z t*@gmail.com

  3. Wenn die E-Mail drei Buchstaben hat, decken Sie den zweiten und dritten mit dem Symbol ab, *zt**gmail.com

  4. Wenn die E-Mail vier oder mehr Buchstaben enthält, zeigen Sie die ersten drei Buchstaben an und fügen Sie am Ende 4 Sterne hinzu - z

    tim****@gmail.com
    tom****@gmail.com
    

Mein Code funktioniert, aber ich habe das Gefühl, dass er viel zu hart codiert und viel sauberer gemacht werden kann

public static String hideSomeOfEmailValue(String privateEmail) {
StringBuilder stringBuilder = new StringBuilder(privateEmail);
int atSignIndex = privateEmail.indexOf("@");
String emailName = privateEmail.substring(0, atSignIndex);

if (emailName.length() == 1) {
    return stringBuilder.replace(0, emailName.length(), "*").toString();
}
if (emailName.length() > 1 && emailName.length() < 4) {
    return stringBuilder.replace(1, atSignIndex, StringUtils.repeat("*", emailName.length() - 1)).toString();
} else {
    stringBuilder = new StringBuilder(privateEmail.substring(0, 2));
    String emailProvider = privateEmail.substring(atSignIndex);
    stringBuilder.append("****").append(emailProvider);
    return stringBuilder.toString();
}
  1. Suchen Sie, an welchem ​​Index sich das Schild befindet
  2. Schneiden Sie alles bis zum Zeichen, das uns nur den Namen der E-Mail gibt, damit wir es leicht können.

Antworten

5 MarioIshac Sep 05 2020 at 11:19

Bugs:

  1. privateEmail.substring(0, 2)Bedürfnisse sich ändern privateEmail.substring(0, 3)in der elseseit Ende Index exklusiv ist , und wir wollen drei Zeichen enthalten, nicht 2.

  2. Die Methode geht davon aus, dass sie privateEmailein "@" enthält, und überprüft nicht, ob atSignIndexsich -1 ergibt, was zu einem StringIndexOutOfBoundsException"@" führt. Geben Sie privateEmail(ohne ausgeblendetes Ausblenden) frühzeitig zurück, wenn Sie erwarten, dass dieser Methode eine generische Zeichenfolge übergeben wird, bei der es sich möglicherweise um eine E-Mail handelt, oder wenn bei throweinem IllegalArgumentExceptionif privateEmailimmer eine E-Mail erwartet wird. Letzteres halte ich für besseres Design. Beachten Sie, dass beide Situationen auch leere Zeichenfolgen verarbeiten.

Verbesserungen:

  1. Verwenden Sie vardiese Option für die Typinferenz, bei der der Typ auf der rechten Seite erkennbar ist, z. B. new StringBuilder(...)oder String#substring. Dies ist ab Java 10.

  2. 1 < emailName.length() ist redundant, da die Länge 0 und 1 in früheren Fällen behandelt wird.

  3. StringUtils.repeatkann ab String#repeatJava 11 durch ersetzt werden. Hier sind externe Abhängigkeiten erforderlich.

  4. Das Instanziieren eines neuen StringBuilderim else kann durch das Mutieren des aktuellen ersetzt werden, und zwar durch die Methoden deleteund insertinstance.

  5. Verschieben Sie die stringBuilderDeklaration nach unten, nur wenn sie benötigt wird.

  6. Ersetzen Sie "*" durch eine static finalVariable, sodass wir sie später in "-" oder "_" ändern und über alle ifs und die hinweg konsistent bleiben können else. Dies muss, obwohl es sich um ein Zeichen handelt, ein sein String, um typkompatibel mit String#repeatund zu bleiben StringBuilder#replace. Endgültiger Code:

private static final String HIDE_CHAR = "*";

public static String asHiddenEmail(String privateEmail) {
    int atSignIndex = privateEmail.indexOf("@");

    if (atSignIndex == -1) {
        throw new IllegalArgumentException("`privateEmail` must be an email.");
    }

    var stringBuilder = new StringBuilder(privateEmail);
    var emailName = privateEmail.substring(0, atSignIndex);

    if (emailName.length() == 1) {
        return stringBuilder.replace(0, emailName.length(), HIDE_CHAR).toString();
    }
    if (emailName.length() < 4) {
        var hiddenNameEnd = HIDE_CHAR.repeat(emailName.length() - 1);
        return stringBuilder.replace(1, atSignIndex, hiddenNameEnd).toString();
    }
    else {
        stringBuilder.delete(3, atSignIndex);
        stringBuilder.insert(3, HIDE_CHAR.repeat(4));
        return stringBuilder.toString();
    }
}
DorianGray Sep 07 2020 at 18:35

Ich habe den Code ein wenig überarbeitet, eine switch-Anweisung verwendet, den Code kommentiert (wichtig!) Und die einzelnen Fälle vereinfacht. Vielleicht wäre ein Name wie obfuscateEMailverständlicher.

Der Fall "Sollte nicht passieren" könnte durch Auslösen einer Ausnahme ersetzt werden.

public class EMail {
    public static void main(String[] args) {
        System.out.println(hideSomeOfEmailValue("[email protected]")); //$NON-NLS-1$
        System.out.println(hideSomeOfEmailValue("[email protected]")); //$NON-NLS-1$
        System.out.println(hideSomeOfEmailValue("[email protected]")); //$NON-NLS-1$
        System.out.println(hideSomeOfEmailValue("[email protected]")); //$NON-NLS-1$
        System.out.println(hideSomeOfEmailValue("[email protected]")); //$NON-NLS-1$
        System.out.println(hideSomeOfEmailValue("[email protected]")); //$NON-NLS-1$
    }
    
    /**
     * 
     * @param privateEmail
     * @return
     */
    public static String hideSomeOfEmailValue(String privateEmail) {
        final int atSignIndex = privateEmail.indexOf('@');
        if (atSignIndex <= 0) {
            // Not an E-Mail address.
            // Shouldn't happen. Return the input.
            return privateEmail;
        }
        
        final StringBuilder obfuscatedEmail = new StringBuilder(privateEmail);
        switch (atSignIndex) {
        case 1:
            // When email only has one letter then just cover that letter with the * symbol e.g. *@gmail.com
            obfuscatedEmail.setCharAt(0, '*');
            return obfuscatedEmail.toString();

        case 2:
            // When email has two letters then cover second letter with the * symbol e.g. t*@gmail.com
            obfuscatedEmail.setCharAt(1, '*');
            return obfuscatedEmail.toString();
            
        case 3:
            // When email has three letters then cover second and third with the symbol * e.g. t**gmail.com
            return obfuscatedEmail.replace(1, 3, "**").toString(); //$NON-NLS-1$
            
        default:
            // When email has four or more letters then show first three letters and add 4 stars at the ends - e.g. tim****@gmail.com
            return obfuscatedEmail.replace(3, atSignIndex, "****").toString(); //$NON-NLS-1$
        }
    }
}

Die Ausgabe des Hauptmethids ist wie folgt (dies muss ein JUnit-Test sein):

*@gmail.com
a*@gmail.com
a**@gmail.com
abc****@gmail.com
abc****@gmail.com
abc****@gmail.com