2
votes

Séparer une chaîne à l'aide d'IndexOf et d'une sous-chaîne sans utiliser de fractionnement ou de boucle

Disons que j'ai une adresse e-mail. Comme: kate.daniels@somecompany.com.
Et j'ai besoin de le séparer sans utiliser de split ou de boucles. Et que j'ai besoin d'utiliser IndexOf en combinaison avec une sous-chaîne et sans utiliser de boucle (cela viendra plus tard après avoir une bonne compréhension de cela en premier).

Mais en regardant cette adresse e-mail avec le comprendre que les adresses e-mail sont au format: (firstName + "." + lastName + "@" + companyName + ".com")

emailAddress = input.nextLine();
//  This is where I have issues.
firstName = emailAddress.substring(emailAddress.IndexOf(".") );

// How do I get this to be just the last name and not lastName + "@somecompany.com"
lastName = emailAddress.substring(emailAddress.IndexOf(".") + 1);

// And how do I get the company name without the ".com"
companyName = emailAddress.substring(emailAddress.IndexOf("@") + 1);

Merci pour toute aide que vous pouvez fournir. Je peux voir en quoi cela serait très utile et j'aimerais apprendre.

J'ai regardé et je n'ai pas vu de réponse à ma question.


1 commentaires

Double possible de la plage d'index de sous-chaîne


3 Réponses :


0
votes

Si vous trouvez le @ en premier et que vous divisez la chaîne ici, vous pouvez trouver le . dans l'une ou l'autre partie sans vous soucier de l'autre.


0 commentaires

0
votes

Voici comment vous le feriez dans ce scénario:

Firstname: kate
Lastname: daniels
Company: somecompany

Output: final

String emailAddress = "kate.daniels@somecompany.com";
String firstName = emailAddress.substring(0, emailAddress.indexOf('.'));
String lastName = emailAddress.substring(emailAddress.indexOf('.') + 1, emailAddress.indexOf('@'));
String companyName = emailAddress.substring(emailAddress.indexOf('@') + 1, emailAddress.lastIndexOf('.'));
System.out.println("Firstname: " + firstName + "\nLastname: " + lastName + "\nCompany: " + companyName); //Print them

Substring a besoin de deux paramètres pour obtenir une plage , un index de début et de fin. Sous-chaîne avec un seul paramètre unique suppose que le paramètre est l'index de début et renvoie le reste de la chaîne à partir de cet emplacement. Consultez la documentation ici.

Notez que l'index de début pour sous-chaîne est inclusif donc pour lastName et companyName j'avais besoin de mettre +1 pour exclure le . et le @ du résultat.

Une autre chose importante à noter est que pour emailAddress j'ai dû utiliser lastIndexOf (".") car il y a deux points dans le String et cela garantira que vous obtiendrez le dernier pour sous-chaîne les plages correctes. Normalement, indexOf renvoie la première occurrence.


2 commentaires

Merci beaucoup! Ceci est exactement ce que je cherchais! C'est vraiment cool. Je suis nouveau sur Java, je viens du côté des bases de données du monde et être capable de casser les choses comme ça est merveilleux.


@Martha Pas de problème. Je sais que vous avez dit de ne pas utiliser split pour le problème aussi, mais à l'avenir, il pourrait être utile d'utiliser quelque chose comme String [] s = emailAddress.split ("[. @]"); qui est beaucoup plus simple et mettra dans les 3 noms dont vous avez besoin dans les 3 premiers emplacements de tableau! Bonne chance!



0
votes

Je pense que la meilleure solution est d'utiliser RegExp . C'est beaucoup plus clair que str.substring().

String email = "kate.daniels@somecompany.com";
int dotOne = email.indexOf('.');
int at = email.indexOf('@', dotOne + 1);
int dotTwo = email.indexOf('.', at + 1);

String firstName = email.substring(0, dotOne);        // kate
String lastName = email.substring(dotOne + 1, at);    // daniels
String companyName = email.substring(at + 1, dotTwo); // somecompany

Au cas où vous voudriez vraiment utiliser str.substring () code>, alors tout ce dont vous avez besoin est juste de trouver une limite de points et de l'utiliser:

String email = "kate.daniels@somecompany.com";
Pattern pattern = Pattern.compile("(?<firstName>\w+)\.(?<lastName>\w+)@(?<companyName>\w+)\.\w+");
Matcher matcher = pattern.matcher(email);

if (matcher.matches()) {
    String firstName = matcher.group("firstName");      // kate
    String lastName = matcher.group("lastName");        // daniels
    String companyName = matcher.group("companyName");  // somecompany
}


1 commentaires

Merci de votre aide à ce sujet. Je n'ai pas encore commencé à utiliser RegExp, mais une fois que je le ferai, j'y reviendrai. Je vous remercie