Vous avez inclus le @
comme optionnel, donc la correspondance essaye d'obtenir le nom d'utilisateur le plus long. Comme vous n'avez pas mentionné que le nom d'utilisateur ne peut pas contenir de @
, il a trouvé la chaîne la plus longue.
Il suffit d'utiliser :
[^@]*
comme sous-expression correspondante pour les noms d'utilisateur (et utilisez $0
pour obtenir la chaîne correspondante)
Ou vous pouvez utiliser celui-ci qui peut être utilisé pour trouver plusieurs correspondances (et obtenir à la fois la partie utilisateur et la partie domaine) :
\b([^@\s]*)(@[^@\s]*)?\b
Le \b
force votre chaîne à être liée à des limites de mots, puis le premier groupe correspond à des caractères non-espace et non-@
(n'importe quel nombre, il est préférable d'utiliser +
au lieu de *
là, car les noms d'utilisateur doivent avoir au moins un caractère) suivi (optionnellement) par un @
et une autre chaîne de caractères non espace et non-@
). Dans ce cas, $0
correspond à toute l'adresse e-mail, $1
correspond à la partie nom d'utilisateur, et $2
correspond à la partie @domaine
(vous pouvez affiner pour obtenir uniquement la partie domaine, en ajoutant une nouvelle paire de parenthèses, comme dans
\b([^@\s]*)(@([^@\s]*))?\b
Voir la démonstration.
0 votes
Vous devez avoir
if (fieldMatcher.find())
là aussi, non? EssayezString userId = s.replaceFirst("^([^@]+).*", "$1");
0 votes
(.*)@?.*
peut-être?1 votes
yourString.split("@")[0]