2
votes

Une seule ligne pour extraire le domaine de l'adresse e-mail

Comment extraire éventuellement le domaine de local-part @ domain ? Ma tentative est

Try(email.split("@")(1)).toOption

mais il semble qu'il devrait y avoir un moyen sans dépendre de la gestion des exceptions. Idéalement, je suis après une ligne.


1 commentaires

«la plus courte une doublure» et la «manière plus propre» ne sont pas souvent la même chose. J'ai voté pour la fermeture parce qu'il semble principalement basé sur une opinion parmi la myriade de façons scala de le faire et non sur quelque chose où il peut y avoir une réponse faisant autorité.


6 Réponses :


2
votes
email.split("@").lastOption
These are equivalent ONLY if what's passed is an email address.If the string passed doesn't include @ then lastOption will still return a Some() of the entire string, whereas your solution will return a None.So if you can trust your input then this answer provides a cleaner approach.

0 commentaires

1
votes

Vous pouvez utiliser Some (email.split ("@") (1)) , cela divisera la String , puis encapsulera Some , qui est une instance de Option .


2 commentaires

Cela lancera si @ est manquant, par exemple, Some ("foobar.com" .split ("@") (1)) .


@MarioGalic et qu'attendez-vous dans ce cas?



3
votes
email.dropWhile(_ != '@').drop(1)

1 commentaires

ceci renvoie une chaîne vide s'il n'y a pas de @ , mais ce que l'OP veut, c'est avoir None dans ce cas



4
votes

Pas une seule doublure, et ne fonctionne que sur 2.13 . Mais cela me semble très clair.

def extractDomain(email: String): Option[String] = email match {
  case s"${_}@${domain}" => Some(domain)
  case _ => None
}

(Notez que s'il y a plus d'un signe @ , celui-ci sera simplement divisé sur le premier) .


0 commentaires

0
votes

Pas une seule ligne, mais je correspond toujours sur les extracteurs de tableau quand je fais String.split (pré-2.13), je pense que c'est assez court et lit beaucoup mieux que d'obtenir des pièces par index.

email.split("@", 2) match {
  case Array(_, domainPart @ _*) => domainPart.headOption
}

limit = 2 s'assure que domainPart a au plus 1 élément.

Notez que vous n'avez pas besoin d'un fourre-tout dans ce cas, puisque split retournera toujours au moins une valeur dans le tableau (bien qu'il soit logique de le couvrir avec des tests pour se protéger contre les changements futurs) .


0 commentaires

1
votes

Permettez-moi de tricher un peu: je préparerai un fichier séparé Email.scala avec l'extracteur:

val Email(_, domain) = "test@domain.com"

et ensuite il pourra être utilisé avec la correspondance de motif: p>

object Email{
  def unapply(mail: String): Option[(String, String)] = {
        mail match {
        case s"$user@$domain" => Some(user, domain)
        case _ => None
      }
  }
}


0 commentaires