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.
6 Réponses :
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.
Vous pouvez utiliser Some (email.split ("@") (1))
, cela divisera la String
, puis encapsulera Some code>, qui est une instance de
Option
.
Cela lancera si @
est manquant, par exemple, Some ("foobar.com" .split ("@") (1))
.
@MarioGalic et qu'attendez-vous dans ce cas?
email.dropWhile(_ != '@').drop(1)
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
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) .
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) .
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 } } }
«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é.