Verstecke bestimmte E-Mail-Zeichen
E-Mail-Zeichen ausblenden:
Wenn E-Mails nur einen Buchstaben haben, bedecken Sie diesen Buchstaben einfach mit dem
*Symbol, z*@gmail.comWenn die E-Mail zwei Buchstaben enthält, decken Sie den zweiten Buchstaben mit dem Symbol * ab, z
t*@gmail.comWenn die E-Mail drei Buchstaben hat, decken Sie den zweiten und dritten mit dem Symbol ab,
*zt**gmail.comWenn 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();
}
- Suchen Sie, an welchem Index sich das Schild befindet
- Schneiden Sie alles bis zum Zeichen, das uns nur den Namen der E-Mail gibt, damit wir es leicht können.
Antworten
Bugs:
privateEmail.substring(0, 2)Bedürfnisse sich ändernprivateEmail.substring(0, 3)in derelseseit Ende Index exklusiv ist , und wir wollen drei Zeichen enthalten, nicht 2.Die Methode geht davon aus, dass sie
privateEmailein "@" enthält, und überprüft nicht, obatSignIndexsich -1 ergibt, was zu einemStringIndexOutOfBoundsException"@" führt. Geben SieprivateEmail(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 beithroweinemIllegalArgumentExceptionifprivateEmailimmer eine E-Mail erwartet wird. Letzteres halte ich für besseres Design. Beachten Sie, dass beide Situationen auch leere Zeichenfolgen verarbeiten.
Verbesserungen:
Verwenden Sie
vardiese Option für die Typinferenz, bei der der Typ auf der rechten Seite erkennbar ist, z. B.new StringBuilder(...)oderString#substring. Dies ist ab Java 10.1 < emailName.length()ist redundant, da die Länge 0 und 1 in früheren Fällen behandelt wird.StringUtils.repeatkann abString#repeatJava 11 durch ersetzt werden. Hier sind externe Abhängigkeiten erforderlich.Das Instanziieren eines neuen
StringBuilderim else kann durch das Mutieren des aktuellen ersetzt werden, und zwar durch die Methodendeleteundinsertinstance.Verschieben Sie die
stringBuilderDeklaration nach unten, nur wenn sie benötigt wird.Ersetzen Sie "*" durch eine
staticfinalVariable, sodass wir sie später in "-" oder "_" ändern und über alleifs und die hinweg konsistent bleiben könnenelse. Dies muss, obwohl es sich um ein Zeichen handelt, ein seinString, um typkompatibel mitString#repeatund zu bleibenStringBuilder#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();
}
}
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