2 votes

Regex pour correspondre à l'utilisateur et utilisateur@domaine

Un utilisateur peut se connecter en tant que "utilisateur" ou en tant que "utilisateur@domaine". Je veux seulement extraire "utilisateur" dans les deux cas. Je suis à la recherche d'une expression à mettre en correspondance, mais j'ai du mal.

final Pattern userIdPattern = Pattern.compile("(.*)[@]{0,1}.*");
final Matcher fieldMatcher = userIdPattern.matcher("utilisateur@test");
final String userId = fieldMatcher.group(1)

userId retourne "utilisateur@test". J'ai essayé différentes expressions mais il semble que rien ne corresponde à mes besoins :-(

Des idées?

0 votes

Vous devez avoir if (fieldMatcher.find()) là aussi, non? Essayez String userId = s.replaceFirst("^([^@]+).*", "$1");

0 votes

(.*)@?.* peut-être?

1 votes

yourString.split("@")[0]

2voto

Wiktor Stribiżew Points 100073

Si vous utilisez le modèle "(.*)[@]{0,1}.*" avec .matches(), le (.*) capture d'abord toute la ligne, puis, lorsque l'index regex est toujours à la fin de la ligne, le modèle [@]{0,1} se déclenche et correspond à la fin de la ligne car il peut correspondre à 0 caractères @, puis .* correspond à nouveau à cet emplacement car il correspond à n'importe quels caractères 0+. Ainsi, toute la ligne se retrouve dans votre Groupe 1.

Vous pouvez utiliser

String userId = s.replaceFirst("^([^@]+).*", "$1");

Consultez la démonstration regex.

Détails

  • ^ - début de la chaîne
  • ([^@]+) - Groupe 1 (référencé avec $1 depuis le modèle de remplacement) : n'importe quels 1+ caractères autres que @
  • .* - le reste de la chaîne.

0 votes

Merci, cela a répondu à ma question. Un administrateur est autorisé à modifier les modèles correspondants selon ses besoins. Donc j'utiliserai ceci : final Pattern userIdPattern = Pattern.compile("([^@]+)[@]{0,1}.*");

0 votes

@Henfo [@]{0,1} est redondant, cela ne fait aucune différence s'il y a [@]{0,1} à l'intérieur du motif ou non.

1voto

Michael Wiles Points 7570

Un peu de recherches sur Google a donné ceci :

(.*?)(?= @|$)

Correspondra à tout ce qui se trouve avant un @ facultatif

0 votes

Voir stackoverflow.com/questions/5979342/… pour l'endroit où j'ai trouvé ceci

0 votes

Selon le code Java où ce modèle est utilisé, il se peut qu'il ne fonctionne pas comme prévu.

0 votes

@WiktorStribizew Je suis intrigué... pourquoi cela ne le fera-t-il pas?

0voto

JustSomeDude Points 719

Je suggérerais de le garder simple et de ne pas compter sur les expressions régulières dans ce cas si vous utilisez Java et que vous avez un cas simple comme celui que vous avez fourni.

Vous pourriez simplement faire quelque chose comme ceci :

String userId = "user@test";

if (userId.indexOf("@") != -1)
    userId = userId.substring(0, userId.indexOf("@"));

// à partir de là, userId sera "user".

Cela supprimera toujours le "@test" ou simplement sautera cette étape lorsque ce n'est pas présent.

Utiliser des expressions régulières dans la plupart des cas rend le code moins maintenable par un autre développeur à l'avenir car la plupart des développeurs ne sont pas très bons avec les expressions régulières, du moins d'après mon expérience.

0voto

Luis Colorado Points 167

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X